Introduction

This report is an overview of the initial observations and analysis performed on the Food Security Cluster 5Ws data for 2021; the issues identified and analysis have been broken into large groups corresponding with the first 4 chapters – geographical coverage, activities and modalities, partners and beneficiaries. This report ends with a brief section on next steps and an interactive reference table and interactive reference maps.

The FSC has endeavoured to provide actionable information and believe that releasing this report is a necessary part of jump-starting the process of resolving the more pressing concerns identified. Further analysis is merited in several areas; and this will be undertaken once consultations with partners have been completed. Unless otherwise specified, beneficiary figures in this report are unique beneficiaries, as opposed to beneficiary frequencies.


a. Summary of key findings

  • The 2021 response was skewed towards Yangon and Rakhine – Yangon and Rakhine 78% of the beneficiaries reached; 24% of all beneficiaries originate from Hlaingtharya township alone and the top 10 townships account for 76% of all beneficiaries reached.

  • Four of the eight Food Security activities (monthly food baskets, support for income generation, livestock kits and fishery kits) experienced large ramp ups in beneficiaries reached after the addition of the 2021 HRP addendum; but the caseloads for the provision of cash-based transfers and technical training were largely established prior to 2021 and only saw incremental increases in beneficiaries reached throughout the year.

  • 61% of beneficiary frequencies received support through the in-kind delivery modality; 25% of beneficiary frequencies were reached by cash transfers – of beneficiaries who received cash transfers, 84% of them were reached through direct cash payments.

  • The most common transfer values – in terms of beneficiaries reached – are between USD 60 and 80, it should also be noted that a not insignificant number of households (about 8%) were reached by cash transfer interventions valued at USD 100 per household or more. The highest average cash transfers were from the provision of livestock kits and the lowest averages from Cash for work/food for assets activities

  • Around 54% of beneficiary households have received 50% or more of the Minimum Expenditure Basket (MEB) for food for the months they were covered. About 10% of all beneficiary households for monthly cash-based transfers received under USD 20 per month (less than 10% of the MEB) and 23% of households received between USD 20 and USD 40 (22% of the MEB).

  • Of the partners who reported in the 5Ws, 62 were implementing partners; 27 partners classified themselves as reporting organisations, though 23 of these were also implementing partners. A total of 66 unique partners reported in the 5Ws during 2021.

  • Only 8 implementing partners have a presence in more than 10 townships, with only 13 being present in more than 5 townships. 78% of implementing partners are present in 5 or less townships. 34 implementing partners have reached less than 10,000 beneficiaries and the median number of beneficiaries reached by implementing partners is 6,118

  • Age and sex-disaggregated beneficiary figures are one of the most key pieces of missing data in the 5W dataset; values have been largely backfilled from census data and do not provide an accurate representation of the population reached.

  • 82.68% of beneficiaries are from the host/local community, 9.02% are stateless persons from Rakhine and 8.24% are IDPs. Returnees are the rarest type of beneficiary reached, forming only 0.07% of all beneficiaries reached.

  • 49% of beneficiaries of monthly activities experienced gaps or delays in monthly programming, with the most common delay being 3 months. Gaps in monthly programming were experienced in 39 townships, with the majority orginating from Kachin, Ayeyarwady and Rakhine.

  • Food Security Cluster partners are not well-positioned to cover the 2022 population in need. Partners are largely concentrated in Kachin, Rakhine and Yangon, with only one partner present in Shan (East) and two in Tanintharyi. Overall, 58% of townships, containing 46% of the 2022 PIN, do not have any partners present.



1. Geographical coverage

1.1 Comparing beneficiaries reached and 2021 PIN by state and region

A total of 3,260,968 unique beneficiaries have been reached across the country, of which, 2,785,524 pertained to HRP and IERP activities and townships and 475,444 were non-HRP. Overall, 100.62% of the targetted 2,768,349 persons in the HRP/IERP were reached.




1.2 Table of beneficiaries and PIN by state and region

Beneficiaries reached (desc.) by state/region
state HRP_ben IERP_ben non_HRP_ben total_ben %_of_total_ben
Yangon 0 1,828,932 182,643 2,011,575 61.69
Rakhine 530,202 0 0 530,202 16.26
Mandalay 0 25,037 118,489 143,526 4.40
Ayeyarwady 0 66,432 33,049 99,481 3.05
Magway 0 7,645 89,122 96,767 2.97
Kachin 89,818 0 0 89,818 2.75
Shan (North) 53,733 4,954 14,416 73,103 2.24
Kayin 13,503 47,338 7,267 68,108 2.09
Mon 0 41,383 6,798 48,181 1.48
Sagaing 0 27,992 3,993 31,985 0.98
Kayah 0 16,457 1,289 17,746 0.54
Chin 9,726 7,279 0 17,005 0.52
Shan (South) 0 5,750 9,761 15,511 0.48
Bago (East) 4,357 0 8,617 12,974 0.40
Tanintharyi 0 4,476 0 4,476 0.14
Shan (East) 0 510 0 510 0.02
All beneficiaries have been included in this table, regardless of their inclusion in the HRP/IERP


The response is fairly skewed at the state/region level. Yangon and Rakhine form 78% of the beneficiaries reached. Beneficiaries from Rakhine were mostly associated with the HRP, whilst beneficiaries from Yangon were mostly associated with the IERP.



1.3 Township-level distribution of beneficiaries

Just as the response is heavily weighted towards Yangon and Rakhine at the state and region level, the same is also true at the township level. These 10 townships below are where 76% of all FSC beneficiaries.

Top 10 townships by beneficiaries reached (desc)
township HRP_ben IERP_ben non_HRP_ben total_ben %_of_total_ben
Hlaingtharya 0 594,836 177,822 772,658 23.69
Other 141 townships 282,037 305,963 178,733 766,733 23.51
Shwepyithar 0 379,774 776 380,550 11.67
Dagon Myothit (Seikkan) 0 276,430 0 276,430 8.48
Dala 0 271,760 0 271,760 8.33
North Okkalapa 0 255,380 0 255,380 7.83
Sittwe 149,885 0 0 149,885 4.60
Buthidaung 147,985 0 0 147,985 4.54
Maungdaw 121,432 0 0 121,432 3.72
Nyaung-U 0 0 71,547 71,547 2.19
Myingyan 0 42 46,566 46,608 1.43
All beneficiaries have been included in total_ben, regardless of their inclusion in the HRP/IERP


151 townships overall have been reached by food security activities in the first three-quarters of 2021. This is 42.42% the 330 townships in the country. 140 townships have been reached by HRP/IERP activities.

It is important to note that the 2021 targets – especially those for the IERP – were developed more of as an approximation of response capacities rather than being estimates related to any measure of vulnerability. Additionally, not all townships targetted as part o the IERP have specific targets: for instance, neither Nyaung-U nor Myingyan (both in Mandalay) from the table above had specific targets.

To momentarily narrow down the focus to the 55 townships with specific HRP or IERP targets, there is substantial variance in the percentage of the target that has been reached. Hlaingtharya’s beneficiary figures are 378% of its established target, whereas Hpapun in Kayin and Kyethi in Shan had been targetted since the initial HRP and have not been reached by any FSC activities; additionally, Dagon Myothit (North), Insein and Chanayethazan in Yangon were targetted in the IERP and also have not been reached.

Of these 55 townships, 28 townships reached more than 120% of their target, 3 reached between 100% and 119% of their target; 4 townships reached between 80% and 100% of their target; and 15 townships reached less than 80% of their target.



The histogram above groups townships based on the percent of their target reached, with the percent reached on the x-axis and the number of townships on the y-axis. From a programme management perspective, it would be desirable to see the majority of townships within the yellow box (between 80% and 120% of the target reached), which would indicate the judicious deployment of resources. However, we see that both overreach and under-reaching are very common, with the largest numbers of townships clustered around 0% and 200% or more of the target reached.


In terms of specific locations,on average, partners worked in 12 locations per township. However, in townships such as Sittwe, at the extreme right of the plot below, partners worked in a total of 85 camps and 43 villages, towns or wards. However, this pattern does not hold for Buthidaung or Maungdaw, where partners worked in 7 camps and 88 villages/wards/towns and in 7 camps and 85 villages/towns/wards respectively. This will be explored further in the next section.




1.4 Locations

Partners have responded in a total of 2500 locations across the country, with the vast majority of locations only having only one partner operating in them; the maximum number of partners in any location is 4. Of the 16041 rows reported in the 5Ws, only 211 did not report a specific location.

Locations are classified into three groups – camps, industrial zones and villages/towns/wards:

Summary of location types
location_type locations townships beneficiaries pc_of_ben avg_ben_per_loc
village_ward_town 2,088 125 2,546,522 88.45 1,220
camp 435 42 324,606 11.27 746
industrial_zone 5 2 7,870 0.27 1,574
381,970 beneficiaries were reported in rows without specific locations


The vast majority of locations are served by only one partner. Below are a series of histograms showing the variation in the number of beneficiaries by location, split by number of partners in each location. Locations with one partner present have a large peak around 100 beneficiaries per locations; and a slight majority of locations with two partners have more than 1,000 beneficiaries.


In general, the more partners operating in a given location, the higher the average number of beneficiaries; however, it should be noted that these multi-partner locations are comparatively rare. The location with four partners is Nam Hlaing in Bhamo, Kachin; it is suspected that the high number of partners is due to beneficiaries from this village participating in a range of activities and trainings held in the township seat.

Average beneficiaries by locations with one, two, three and four partners
number_of_partners locations avg_beneficiaries
one 2,396 142
two 110 930
three 12 2,258
four 1 49




2. Activities and modalities

2.1 Monthly progress by activity

Partners reported their achievements across the eight 5W activities. The majority of the caseload for monthly cash-based transfers was established prior to 2021 (with the number of beneficiaries only increasing very incrementally across the course of the year) – this highlights that many of the projects contributing to this activity repeat year after year and had been ongoing prior to the HRP; this pattern is also apparent in the provision of technical training.

One of the difficulties of interpreting these data is that it is not always apparent where the patterns observed are reflective or changes in the field (such as changes in access, funding or staffing) or if they are instead due to partners’ reporting behaviours. For instance, for the large jump in the number of beneficiaries for fishery kits and food baskets after June 2021 (marked by the dotted grey line), this coincides with the approval of the HRP addendum/IERP. However, some of the other changes are less clear and will require careful exploration with partners.


2.2 Delivery modalilties

Cash and in-kind distributions were each the main delivery modality in three activities, with the provision of services and support being predominant in two. The in-kind modality has the highest reach, given the especially large beneficiary numbers originating from the provision of monthly food baskets. Several misclassifications – small portions of monthly cash transfers have been coded as “in-kind” and there are in-kind food baskets coded as “cash” and “hybrid”. It might also be worth more clearly delineating between “support for income-generating activities” and the “provision of technical training” as service delivery and support are heavily present in both.



61% of beneficiary frequencies received support through the in-kind delivery modality; beneficiary frequencies are used here as there were several instances of modalities changing partway through an intervention: for reference, 83% of beneficiaries were reached initially with in-kind interventions, meaning that there was a tendency to diversify away from in-kind support over 2021. 25% of beneficiary frequencies were reached by cash transfers.


Beneficiary frequencies by delivery modalities and frequency of distribution
delivery_modality First Monthly One-off Other NA Total %Total
In-kind 303,595 1,850,712 509,892 2,773,854 111,839 5,549,892 61.36
Cash 894 1,923,133 176,464 40,274 117,525 2,258,290 24.97
Service delivery/support 773,212 128,852 4,901 767 907,732 10.04
Hybrid (In-kind & Cash) 295,312 2,938 10,810 309,060 3.42
Voucher 2,652 16,519 19,171 0.21
Total 304,489 4,842,369 820,798 2,846,358 230,131 9,044,145 100.00
Beneficiary frequencies reported without a delivery modality specified have been excluded


Regarding the table above, there is a strong argument to remove the option “other” from the 5W column frequency (referring to frequency of transfer/delivery) – what exactly it connotes is unclear, as partners might elect this option for activities that occur both more and less frequently than every month; there is also the possibility that partners are just electing “other” instead of leaving the column blank. It is possible to backfill some of the “other” values from the beneficiary_recurrency column. This will be explored further in the chapter on beneficiaries.

There is also justification to drop the “First” category as it does not really have much relation to the “Monthly” category, i.e. an increase in beneficiaries reported as “First” do not correspond to an increase in “Monthly” beneficiaries in the following months, meaning that these beneficiaries should fall under the “One-off” category.

The column months_of_food_ration_distributed, but this column is largely blank and non-NA values have also not been filled well, meaning that a key piece of data – activity durations – has not been effectively captured. However, a workaround – requiring considerable effort – yields us the table below, showing the average duration (in months) of the various activities classified as “Monthly” under the frequency column:

Average duration (in months) of monthly activities
activity avg_duration_months
Provide monthly cash-based transfers 7.38
Provide crops & vegetables kits 6.00
Provide support for income generation 5.99
Provide technical training 4.75
Provide monthly food baskets 4.24
Cash for Work / Food for Assets 2.13



2.3 Monetary values of intervention packages per household



The most common transfer values – in terms of beneficiaries reached – are between USD 60 and 80, it should also be noted that a not insignificant number of households (about 8%) were reached by cash transfer interventions valued at USD 100 per household or more (though to what extent the more extreme values are correct remains to be investigated). It should also be noted that 35% of the households who received transfers values at below USD 40/month were the beneficiaries of the “hybrid” delivery modality, and it is possible that the value of the in-kind goods they received might not have been included in this sum. Please note that these monetary values were calculated only from rows with unique beneficiaries and that these are not the cumulative sums per household.


Cash transfer, hybrid and voucher values per household, by cash delivery mechanism (USD)
cash_delivery_mechanism <$10 >=$10_<$20 >=$20_<$40 >=$40_<$60 >=$60_<$80 >=$80_<$100 >=$100 total_hhd pc_of_hhd
Direct cash payment 9,045 5,467 7,483 9,065 20,313 1,543 4,086 57,002 85.59
E-voucher 2,519 929 3,448 5.18
E-transfer 798 1,161 435 2,394 3.59
Mobile money 1,830 1,830 2.75
Money Transfer Agent 517 90 841 1,448 2.17
Other 8 424 432 0.65
Paper voucher 48 48 0.07
Only households which were reached by cash, hybrid or voucher modalities are included


By far the most common cash delivery mechanism was direct cash payments – 85.59% of households were reached through this mechanism. Transfers made through Money transfer agents had the highest average transfer amount.

Next, let us take a look at household package values by activity type:

Average value (USD) of household package values per activity
activity hhd_frequencies total_value_usd avg_transfer_value
Provide livestock kits 900 103,950 115.50
Provide support for income generation 14,765 1,550,694 105.02
Provide crops & vegetables kits 3,770 222,471 59.01
Provide monthly cash-based transfers 404,567 21,344,843 52.76
Provide fishery kits 200 8,174 40.87
Cash for Work / Food for Assets 28,520 918,812 32.22
Provide monthly food baskets 74,825 1,067,703 14.27
Only households which were reached by cash, hybrid or voucher modalities are included


Overall, the highest average cash transfers were from the provision of livestock kits and the lowest averages from Cash for work/food for assets activities (after discounting food baskets). Please also note that for the above table, all per household values above USD 700 have been filtered out as they are likely errors. But the average package values are only part of the picture and significant variation in transfer values exists within each activity:



A full 51.29 of households who benefitted from cash-based transfers received packages values between USD 60 and USD 80, indicating that this activity – in addition to the provision of crops and vegetable kits and livestock kits, which also have clear peaks – would be relatively easy to standardise.

This section has tried to work around several data entry errors in the 5W reporting – the per household values of cash transfers have been recalculated using the number of households reached and the total value (in USD) of the cash transfers provided. Going forward, it is necessary to review and confirm these errors with partners and clean the 5W dataset as many of them have recorded cash transfer values of around USD 10.50 per household as opposed to our recalculated value which averages out at USD 63; it is suspected that the per beneficiary value may have been entered as opposed to the value per household.

The partners who have – likely, in error – recorded this USD 10.50 transfer are: WFP, Plan International, Save the Children, Myanmar Heart Development Organisation, People for People, World Vision Myanmar and People in Need.

The table below compares the different bins for cash-transfer values to the minimum expenditure basket for food established by the Cash Working Group – they have set a floor of MMK 190,555 (or USD 114.55) per household per month:

Monthly cash-based transfer values by percentage of MEB received
usd_hhd_bin avg_pc_of_meb avg_usd_month households pc_of_hhd
<$10 6.19 7.09 542 1.26
>=$10_<$20 9.38 10.75 3,776 8.75
>=$20_<$40 27.56 31.57 9,853 22.84
>=$40_<$60 40.20 46.05 5,786 13.41
>=$60_<$80 56.40 64.61 22,135 51.31
>=$80_<$100 80.29 91.97 115 0.27
>=$100 99.04 113.45 935 2.17
Only households reached through monthly cash-based transfers are included


Overall, 60.17 of beneficiary households of cash-based transfers have received 50% or more of the MEB for the months they were covered. About 10% of all beneficiary households for monthly cash-based transfers received under USD 20 per month (less than 10% of the MEB) and 23% of households received between USD 20 and USD 40 (22% of the MEB) – this underscores the importance of standardisation and of the pressing need to collect more information on whether cash transfers (and food baskets) have been designed to be full rations, half rations or are instead intended to be supplementary activities. This is key from a coordination standpoint as the food security needs of those who have received supplementary transfers cannot be considered to have been covered.




3. Partners

Of the implementing partners of the Food Security Cluster, a total of 62 of them classified themselves as implementing partners within the 5Ws. They are fairly evenly split themselves between HRP indicators, with 36 contributing towards food and cash assistance and 39 contributing towards agriculture and other livelihood support. 34 partners have reached less than 10,000 unique beneficiaries and the median unique beneficiaries reached by partners is 6,118. Below are the top 10 partners by HRP indicator. As a side note, it remains to be clarified whether Zigway is a vendor/supplier of WFP or is an implementing partner – some follow up with will be necessary; this is also true for the two private limited companies that also were reported as implementing partners.

Top 10 implementing partners by beneficiaries reached, by HRP indicator
Partners HRP indicator1
  1. Number of people who received food and/or cash assistance
Partners HRP indicator2
  1. Number of people who received agriculture and other livelihood support
MRCS 640,223 CESVI Foundation 196,869
Open Data Myanmar (ODM) 400,933 Center for Social Integrity (CSI) 84,427
Zigway 223,478 Helen Keller International 57,287
Hlaingthayar Development Network 204,275 Action for Green Earth 29,425
Urban Strength (US) 201,732 Action Contre la Faim 23,128
World Vision Myanmar 180,741 People for People 18,273
WFP 110,235 World Vision Myanmar 18,040
Hlaingthayar Youth Network 96,145 Myanmar Heart Development Organization 11,170
Myanmar Heart Development Organization 70,664 Da-Nu National Affairs organization (DNAO) 9,266
Karuna Mission Social Solidarity 70,014 WFP 8,061
Figures reflect beneficiaries reached through direct implementation


3.1 Distribution of partners by beneficiaries and geographic reach

Whilst there is quite a bit of variation in the number of beneficiaries reached, partners’ geographic footprints are, on the whole, quite limited. Only 8 partners have a presence in more than 10 townships, and only 13 are present in more than 5 townships. 78% of our partners (clustered along the bottom of the chart) are present in 5 or less townships. This distribution of partners is an impediment to a countrywide response and it is imperative to understand how best to incentivise partners to expand their footprints.




3.2 Monthly progress by partner


The plot above shows the top 20 partners by number of beneficiaries reached in 2021, with the red line indicating June 2021, when the HRP addendum was approved and published. On the whole, the HRP addendum had a very large effect on the number of beneficiaries reached – most partners enacted a significant ramp up and reached the majority of beneficiaries after it was published. Exceptions to this include organisations such as CESVI, Helen Keller International, Save the Children and Myanmar Heart Development Organisation, who established most of their caseload prior to July 2021. The next chapter will explore the effect the HRP addendum had on persons reached by beneficiary type.



3.3 Types of implementing partners

Average reach by implementing partner type
implementing_partner_type avg_beneficiaries avg_townships avg_states
INGO 40,857 7.58 2.63
NNGO 60,029 3.03 1.21
other 42,642 1.00 1.00
UN 118,296 32.00 8.00
Figures are averages reached by direct implementation


NNGOs, on average, tended to reach more beneficiaries than INGOs, though INGOs tended to have a much wider geographic reach than NNGOs, perhaps due to them having more sub-offices as well as the generally tighter focus of several community-based organisations. There is only one agency in the “UN” category – WFP; the “other” category refers to two private limited companies which also implemented food security activities.



3.4 Reporting organisations

There are 72 combinations between reporting organisations and implementing partners, 23 of which are instances where the reporting organisation and the implementing partner are the same organisation; once these are filtered out, all the remaining implementing partners correspond to just 11 reporting organisations:

Number of implementing partners by reporting organisation
reporting_organization implementing_partners
WFP 25
FAO 6
Finn Church Aid 4
Save the Children 4
Cordaid 2
Mercy Corps 2
Trocaire 2
AVSI 1
Danish Refugee Council 1
Helvetas 1
Oxfam 1


This report has used implementing_partners for most of the analysis as, by their nature, reporting organisations do not have a field presence. As a side note, FAO has not classified itself as an implementing partner, having reported no activities that were directly implemented by them.



3.5 Donors

69% of the rows had the donor column filled. However, this only represents activities reaching 23% of all beneficiaries. Below is a table of the 10 donors (after organisations using their own resources) whose funding has reached the most beneficiaries and the number of townships their funding has been used in:

Top 10 donors by number of beneficiaries reached with their funding
donor beneficiaries pc_of_ben townships
Organizational own funds 191,006 5.86 36
UNDP 118,113 3.62 2
humanitarian Assitance and resilience Programme 87,502 2.68 7
AICS 63,986 1.96 5
MHF 61,056 1.87 11
King Philanthropies 57,287 1.76 7
ECHO 26,789 0.82 3
FCDO 23,282 0.71 3
LIFT 18,958 0.58 9
European Union (EU) 13,882 0.43 4
HELVETAS 13,851 0.42 6
77% of all beneficiaries (2,513,026 persons) were reported with the donor column left blank


Additionally, a number of errors have also been observed, including cases where multiple donors have been combined into one row as well as numerous instances where UNDP, WFP, FAO and UN WOMEN were classified as donors as opposed to reporting organisations. Helvetas should also probably have reported under “organisations using their own funds”.




4. Beneficiaries

4.1 Beneficiary disaggregations

Currently, in the 5Ws, the vast majority of beneficiary diasaggregations have been backfilled from census data and do not, consequently, provide an accurate picture of the population that have been reached by Food Security interventions. It is not possible to determine how far reality diverges from what has been reported so far – meaning that it cannot be determined if there has been any bias in beneficiary selection and targetting. It is imperative to begin collecting disaggregated beneficiary data from partners.

It is entirely possible that partners are collecting this data – disaggregated beneficiary data is one of the most common data required for internal and external reporting – and that it is merely necessary to work with partners to wrangle their data into the 5W format. However, the capacities of partners to disaggregate beneficiary data should be investigated by the cluster and is an important issue that should be brought up in the next plenary session.



4.2 Types of beneficiaries

The states and regions in which the FSC is working the most with IDPs are Bago (East), Kachin, Chin, Shan (North) and Kayah. Overall, 82.68% of beneficiaries are from the host/local community, 9.02% are stateless persons from Rakhine and 8.24% are IDPs. Returnees are the rarest type of beneficiary reached, forming only 0.07% of all beneficiaries reached. Each row in the table below shows the percentage of each beneficiary type within each state/region.

Percentage breakdown of beneficiary types by state/region
state Host/local Community Internally Displaced Returnees Rakhine stateless beneficiaries
Ayeyarwady 100.00 99,481
Bago (East) 66.42 33.31 0.27 12,974
Chin 7.35 92.65 17,005
Kachin 7.68 90.65 1.67 89,818
Kayah 46.88 53.12 17,746
Kayin 67.37 32.63 68,108
Magway 99.03 0.97 96,767
Mandalay 100.00 143,526
Mon 92.50 5.88 1.62 48,181
Rakhine 34.39 10.16 55.45 530,202
Sagaing 25.29 74.71 31,985
Shan (East) 100.00 510
Shan (North) 26.44 73.56 73,103
Shan (South) 100.00 15,511
Tanintharyi 95.64 4.13 0.22 4,476
Yangon 100.00 2,011,575
Total 82.68 8.24 0.07 9.02


Compared to only the 2021 HRP targets (as the IERP does not have breakdowns of the target by beneficiary type), beenficiary type targets have been mostly exceeded, neither the targets for returnees/resettled in Kachin or Shan (North) nor targets for IDPs in Rakhine or Kayin have been met. Interestingly, for Rakhine, the targets for the host/local population have been greatly exceeded and various assumptions can be formulated regarding this:

  • Once targets were met, all further allocations were targetted at the local/host community population
  • There was better integration og the host population into relief programming
  • Greater availability of funds ahd the presence of development donors

In Bago (East), Chin, Kayin and particularly Shan (North), the targets for IDPs have been greatly exceeded, in comparison to the 2021 HRP targets.

Percentage of 2021 HRP target reached by beneficiary type
state host_local% idp% returnees% rakhine_stateless% total%
Bago (East) 171.99 173.38
Chin 0.00 200.74 156.95
Kachin 88.67 110.36 32.88 104.30
Kayin 168.08 196.98
Rakhine 409.86 32.71 105.75 108.83
Shan (North) 135.56 751.31 0.00 400.17
Shan (South) 0.00 0.00
Only HRP/IERP beneficiaries have ben included


Stateless persons from Rakhine have the largest average household sizes, with returnees having the largest variations in household size. With reference to the plot below, the thick bar in the middle of each box shows the average household size for each beneficiary type – this value is also shown in the text label below the line. The lower and upper borders of each box indicate the values for the 25th and 75th percentiles respectively. For instance, households at the 25th percentile of households in host/local communities have only four members and households that have around 5 members have more members than 75% of all the households in that group. Outliers are marked by dots. A lot of potential data entry errors were observed, especially where less than one person per household was reported.




4.3 Monthly progress by beneficiary type


Whilst the numbers of IDPs and Returnees reached did see significant increases after June 2021, no evidence was observed that this was the result of the HRP addendum, rather than the continuation of already existing plans. However, a significant increase in the numbers of persons in the host/local community reached after June 2021 has been noted – almost all host/local community beneficiaries were reached after the publication of the HRP addendum. Conversely, the progress amongst stateless persons in Rakhine slowed substantially after the publication of the addendum.


Reached by beneficiary type, before and after HRP addendum
beneficiary_type before_addendum after_addendum Total %before %after
Host/local Community 52,248 2,175,515 2,227,763 2.35 97.65
Rakhine stateless 239,520 54,472 293,992 81.47 18.53
Internally Displaced 133,736 127,709 261,445 51.15 48.85
Returnees 837 1,487 2,324 36.02 63.98
Only HRP/IERP beneficiaries are included



4.4 Gaps in monthly programming

Number of beneficiaries and locations by duration of gaps in implementation
gap_months locations townships beneficiaries pc_of_ben
0 283 35 457,448 51.48
1 51 21 73,704 8.29
2 122 22 63,397 7.13
3 406 12 236,978 26.67
4 8 5 8,485 0.95
5 9 5 28,195 3.17
8 1 1 20,393 2.29
Only beneficiaries of monthly activities that recurred at least once are included


49% of beneficiaries of monthly activities experienced gaps or delays in monthly programming, with the most common delay being 3 months. The 8-month delay was the provision of monthly food baskets in Buthidaung, where distributions only occurred in February and November 2021. The 5-month delays were all from locations in Rakhine and Kachin. Overall, gaps in monthly programming were experienced in 39 townships, with the majority orginating from Kachin, Ayeyarwady and Rakhine.

There are 276 entries coded as being implemented on a monthly basis that have not recurred – that is, they have only been implemented once: the FSC needs to check with partners if these are merely the first instances of these activities, or if there have been issues with access, security or funding or if they are errors in data entry .



4.5 Potential for post-distribution monitoring

The table below shows activities which have been implemented for 6 months or more, the number of locations they were implemented in and the number of unique beneficiaries reached by activities meeting these criteria. The possibility of joint monitoring – or at least the joint review and analysis of monitoring data – shopuld be explored, in consultation with these partners. The rationale being that 6 months of implementation should be a long enough period of time to make impact monitoring feasible. Additionally, joint monitoring will be further facilitated by the similarity of these activities, almost all of which are recurrent cash transfers or distributions of food baskets.

Number of beneficiaries, by activity, who have received at least 6 months of recurrent food security support
activity partners locations beneficiaries
Provide monthly cash-based transfers 7 231 194,400
Provide monthly food baskets 7 44 147,819
Provide technical training 2 413 57,887
Provide crops & vegetables kits 1 406 57,287
Provide support for income generation 1 407 57,287
Cash for Work / Food for Assets 1 1 245
Only includes beneficiaries (not unique but maximum by location by activity) who have received more than 6 months of support


These are the partners who have implemented monthly food baskets and monthly cash-based transfers for more than 6 months:

Partners who have implemented cash transfers and food baskets for at least 6 months
implementing_partners Provide monthly cash-based transfers Provide monthly food baskets
Karuna Mission Social Solidarity 51,702 85
Myanmar Heart Development Organization 30,185 57,638
People for People 23,982
Plan International 37,657
Save the Children 144
WFP 39,192 42,002
World Vision Myanmar 11,538 19,559
Action for Green Earth 18,755
People Hope Community Development (PHCD) 8,872
Together for Sustainable Development 908
Only includes beneficiaries (not unique but maximum by location by activity) who have received more than 6 months of support




5. Next steps for 2022

5.1 Positioning for 2022

The PIN for 2022 is much more evenly spread across the country than it was in 2021: with reference to the plot below, Magway and Mandalay have some of the lowest proportions of vulnerable persons in relation to the total state population, meaning that careful beneficiary selection and tight vulnerability in these areas will necessary to avoid excessive inclusion errors.



The average percentage of a state’s PIN that is included in the target is 22.18%, though there are some very notable exceptions at both the superior and inferior ends of the scale:



Food Security Cluster partners are not well-positioned to cover the 2022 population in need. Partners are largely concentrated in Kachin, Rakhine and Yangon, with only one partner present in Shan (East) and two in Tanintharyi.

Overall, 57% of townships, containing 46% of the 2022 PIN, do not have any partners present. This lack of nationwide coverage will be one of the most important constraints that the FSC will face in meeting the 2022 needs of vulnerable, food insecure persons and IDPs – and resolving this will necessitate both increasing partner coverage and finding new partners for the cluster.

This mismatch between partner existing partner footprints and the PIN for 2022 highlights the need for more dedicated field-level coordination. This will be necessary in order to reach out to and cultivate new partners and encourage existing partners to expand their operations. Strengthened inter-cluster will also be key to ensure that the needs of persons in need are being met in a comprehensive manner.



5.2 Next steps

  1. Communicate to partners that Yangon is severely oversubscribed in comparison to the rest of the country, above all in the townships of Hlaingtharya, Shwepyithar, Dagon Myothit (Seikkan), Dala and North Okkalapa.

  2. Collect existing intervention packages from partners in order to begin the process of standardisation and to support the review of food baskets for their caloric and nutritional value. Perform additional analysis to understand if beneficiaries in close proximity to each other have received widely divergent package values. Additionally, speak with partners to understand why cash transfer values vary even within the same activity implemented by the same partner.

  3. Revisit areas which have only received smaller supplementary transfers – transfers covering a low percentage of the MEB cannot be considered to have met the food security needs for that area – other partners may be necessary to cover the gap.

  4. Advocate for the expansion of partners’ geographic footprints to reach the remaining 179 townships which have yet to benefit from any FSC activities. The effects of the current crisis in Myanmar have not been determined by an epicentre or a stormpath and there is no programmatic rationale for the response to be so uneven. This advocacy should be targetted at the ICCG, Cluster partners and at donors.

  5. Collect 5W data from other clusters so that multi-sector coverage may be reviewed. Clean and process conflict data so that it may be cross-referenced with partners’ coverage. Share raw data with other Clusters to improve coordination.

  6. Work with partners to determine their current capacities to submit age and sex-disaggregated beneficiary data. Develop a workplan to ensure that they can meet reporting requirements.

  7. Solicit monitoring reports from partners and explore the possibility of joint monitoring.

  8. Revise the 5W template – in consultation with partners – in order to address the data collection issues identified.




6. Reference table – townships

The reference table below may be sorted and filtered by any of the columns.




7. Interactive reference maps


7.1 Map of 2022 PIN by township



7.2 Map of 2021 beneficiaries by township

LS0tDQp0aXRsZTogIkluaXRpYWwgb2JzZXJ2YXRpb25zIG9uIHRoZSBNeWFubWFyIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciA1V3MiDQphdXRob3I6ICJTZWFuIE5nIg0KZGF0ZTogIjI5LzAxLzIwMjEiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgY29sbGFwc2VkOiBmYWxzZQ0KYWx3YXlzX2FsbG93X2h0bWw6IHRydWUgICANCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvPUZBTFNFfQ0KDQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiIjsNCiAgZGlzcGxheTogYmxvY2s7DQogIGhlaWdodDogNzBweDsNCiAgbWFyZ2luOiAyZW0gMjBweCA0MHB4IDIwcHg7DQogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiTXlhbm1hcl9jbHVzdGVyX2JsdWUucG5nIik7DQogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsNCiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjsNCiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCmBgYA0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQogICAgYm9keSAubWFpbi1jb250YWluZXIgew0KICAgICAgICBtYXgtd2lkdGg6IDEyODBweDsNCiAgICB9DQo8L3N0eWxlPg0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkocGFuZGVyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShmdXp6eWpvaW4pDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShzMikNCmxpYnJhcnkoYm9va2Rvd24pDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGdnc2ZsYWJlbCkNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeSh2aXJpZGlzKQ0KDQp0aGVtZV9zZXQodGhlbWVfbGlnaHQoKSkNCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCiMgcGFuZGVyIHRhYmxlcyBhbGwgaW4gb25lIHJvdw0KcGFuZGVyT3B0aW9ucygndGFibGUuc3BsaXQudGFibGUnLCBJbmYpDQoNCiMgcGFuZGVyIHRob3VzYW5kcyBzZXBhcmF0b3INCnBhbmRlck9wdGlvbnMoImJpZy5tYXJrIiwgIiwiKQ0KDQojIHJlcGxhY2UgDQpvcHRzIDwtIG9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAiIikNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGZvciB0cmFuc3Bvc2luZyBkZg0KdHJhbnNwb3NlX2RmIDwtIGZ1bmN0aW9uKGRmKSB7DQogIHRfZGYgPC0gZGF0YS50YWJsZTo6dHJhbnNwb3NlKGRmKQ0KICBjb2xuYW1lcyh0X2RmKSA8LSByb3duYW1lcyhkZikNCiAgcm93bmFtZXModF9kZikgPC0gY29sbmFtZXMoZGYpDQogIHRfZGYgPC0gdF9kZiAlPiUNCiAgICB0aWJibGU6OnJvd25hbWVzX3RvX2NvbHVtbiguZGF0YSA9IC4pICU+JQ0KICAgIHRpYmJsZTo6YXNfdGliYmxlKC4pDQogIHJldHVybih0X2RmKQ0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcw0Kc3VtX2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcywgMiBncm91cGVkIHZhcmlhYmxlcw0Kc3VtX2JlbjIgPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIxLCBjb2x1bW5fdmFyMil7DQogIA0KICBjb2x1bW5fdmFyMSA8LSBlbnF1byhjb2x1bW5fdmFyMSkNCiAgY29sdW1uX3ZhcjIgPC0gZW5xdW8oY29sdW1uX3ZhcjIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIxLCAhIWNvbHVtbl92YXIyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkNCiAgICANCn0NCg0KIyByZWFkaW5nIGluIHRvd25zaGlwcyBmcm9tIGdlb2FkbWlucyANCnRvd25zaGlwcyA8LSByZWFkX2V4Y2VsKCJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOS54bHN4IiwNCiAgICAgICAgICAgc2hlZXQgPSAiR0VPQURNSU5TIikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JSANCiAgc2VsZWN0KGFkbWluMXBjb2RlXzQ6YWRtaW4zcGNvZGUpICU+JSANCiAgcmVuYW1lKGFkbWluMV9wY29kZSA9IGFkbWluMXBjb2RlXzQsDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjNwY29kZSwNCiAgICAgICAgIHN0YXRlX25hbWUgICA9IHN0YXRlXzUsDQogICAgICAgICB0b3duc2hpcF9uYW1lICA9IGNvdW50eSkgJT4lIA0KICByZW1vdmVfZW1wdHkoKQ0KDQojIGxvY2F0aW9ucyBkYXRhc2V0IA0KbG9jYXRpb25zIDwtIGJpbmRfcm93cygNCiAgDQogIHJlYWRfZXhjZWwoIkZTQyA1VyAyMDIxIC0gR0VPQURNSU5TX2ZpbmFsIDE5Lnhsc3giLCAjIHBheWFtcyANCiAgICAgICAgICAgICBzaGVldCA9ICJHRU9BRE1JTlMiKSAlPiUgDQogICAgY2xlYW5fbmFtZXMoKSAlPiUgDQogICAgc2VsZWN0KHN0YXRlX25hbWU6cGF5YW1fY29kZSkgJT4lIA0KICAgIHJlbmFtZShhZG1pbjFfcGNvZGUgPSBzdGF0ZV9jb2RlXzEyLA0KICAgICAgICAgICB0b3duc2hpcF9uYW1lID0gY291bnR5X25hbWUsIA0KICAgICAgICAgICBhZG1pbjNfcGNvZGUgPSBjb3VudHlfY29kZSwNCiAgICAgICAgICAgbG9jYXRpb24gPSBwYXlhbV9uYW1lKSAlPiUNCiAgICByZW1vdmVfZW1wdHkoKSAlPiUgDQogICAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBwYXN0ZTAoInBheWFtIikpLA0KICANCiAgcmVhZF9leGNlbCgiRlNDIDVXIDIwMjEgLSBHRU9BRE1JTlNfZmluYWwgMTkueGxzeCIsICMgY2FtcHMNCiAgICAgICAgICAgICBzaGVldCA9ICJHRU9BRE1JTlMiKSAlPiUgDQogICAgY2xlYW5fbmFtZXMoKSAlPiUgDQogICAgc2VsZWN0KGNvdW50eV9uYW1lMTpwX2NvZGVfY2FtcCkgJT4lIA0KICAgIHJlbmFtZSh0b3duc2hpcF9uYW1lID0gY291bnR5X25hbWUxLA0KICAgICAgICAgICBhZG1pbjNfcGNvZGUgPSBzdGF0ZV9jb2RlXzIzLA0KICAgICAgICAgICBsb2NhdGlvbiA9IGNhbXBzLCANCiAgICAgICAgICAgY2FtcF9wY29kZSA9IHBfY29kZV9jYW1wKSAlPiUgDQogICAgcmVtb3ZlX2VtcHR5KCkgJT4lIA0KICAgIG11dGF0ZShsb2NhdGlvbl90eXBlID0gcGFzdGUwKCJjYW1wIikpICU+JSANCiAgICBsZWZ0X2pvaW4odG93bnNoaXBzICU+JSBzZWxlY3Qoc3RhdGVfbmFtZSwgYWRtaW4xX3Bjb2RlLCBhZG1pbjNfcGNvZGUpLCANCiAgICAgICAgICAgICAgYnkgPSBjKCJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICAgIHJlbG9jYXRlKGFkbWluMV9wY29kZSkgJT4lIA0KICAgIHJlbG9jYXRlKHN0YXRlX25hbWUpLA0KICANCiAgcmVhZF9leGNlbCgiRlNDIDVXIDIwMjEgLSBHRU9BRE1JTlNfZmluYWwgMTkueGxzeCIsICMgaW5kdXN0cmlhbCB6b25lcw0KICAgICAgICAgICAgIHNoZWV0ID0gIkdFT0FETUlOUyIpICU+JSANCiAgICBjbGVhbl9uYW1lcygpICU+JQ0KICAgIHNlbGVjdChzdGF0ZV8yODppbmR1c3RyaWFsX3pvbmVzKSAlPiUgDQogICAgcmVuYW1lKHN0YXRlX25hbWUgPSBzdGF0ZV8yOCwgDQogICAgICAgICAgIGFkbWluMV9wY29kZSA9IGFkbWluMXBjb2RlXzI5LA0KICAgICAgICAgICBsb2NhdGlvbiA9IGluZHVzdHJpYWxfem9uZXMpICU+JQ0KICAgIHJlbW92ZV9lbXB0eSgpICU+JSANCiAgICByZWdleF9sZWZ0X2pvaW4odG93bnNoaXBzICU+JSBzZWxlY3QodG93bnNoaXBfbmFtZSwgYWRtaW4zX3Bjb2RlKSwNCiAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJsb2NhdGlvbiIgPSAidG93bnNoaXBfbmFtZSIpKSAlPiUgDQogICAgIyByZXBsYWNpbmcgdGhlIE5BcyB3aXRoIDBzIHNvIHRoZSBmaWx0ZXIgZG9lc24ndCBkcm9wIHRoZW0gDQogICAgcmVwbGFjZV9uYShsaXN0KHRvd25zaGlwX25hbWUgPSAwLCBhZG1pbjNfcGNvZGUgPSAwLCBhZG1pbjFfcGNvZGUgPSAwKSkgJT4lDQogICAgZmlsdGVyKGFkbWluM19wY29kZSAhPSAiTU1SMDEzMDQwIikgJT4lICMgcmVtb3ZpbmcgYWxsIHRoZSBtYXRjaGVzIGJldHdlZW4gSGxhaW5ndGhhcnlhIGFuZCBIbGFpbmcNCiAgICBmaWx0ZXIoYWRtaW4zX3Bjb2RlICE9ICJNTVIwMTEwMDYiKSAlPiUgIyByZW1vdmluZyBhbGwgdGhlIG1hdGNoZXMgYmV0d2VlbiBZZW5hbmd5YXVuZyBhbmQgWWUNCiAgICBtdXRhdGUobG9jYXRpb25fdHlwZSA9IHBhc3RlMCgiaW5kdXN0cmlhbF96b25lIikpDQogIA0KKSU+JQ0KICBtdXRhdGUobG9jYXRpb25fY29kZSA9IGNhc2Vfd2hlbihsb2NhdGlvbl90eXBlID09ICJjYW1wIiB+IGNhbXBfcGNvZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX3R5cGUgPT0gInBheWFtIiB+IHBheWFtX2NvZGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX3R5cGUgPT0gImluZHVzdHJpYWxfem9uZSIgfiBOQV9jaGFyYWN0ZXJfKSkgJT4lDQogIG11dGF0ZShsb2NhdGlvbnNfZnV6enkgPSBzdHJfcmVwbGFjZV9hbGwobG9jYXRpb24sICJbWzpwdW5jdDpdXSIsICIiKSkNCg0KIyByZWFkaW5nIGluIHBpbiBhbmQgdGFyZ2V0cw0KcGluIDwtIHJlYWRfZXhjZWwoIlBJTiBjYWxjdWxhdGlvbiBGb29kIFNlY3VyaXR5IENsdXN0ZXJfVG93bnNoaXAgQnJlYWtkb3duLnhsc3giLA0KICAgICAgICAgICBzaGVldCA9ICJGb29kIFNlYyBQaU4gd2l0aCBJRFBzIiwgDQogICAgICAgICAgIHNraXAgPSAyKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QoLWMoeDE3LCB4MTgsIHgxOSkpICU+JSANCiAgc2xpY2UoMTozNDYpICU+JSANCiAgZmlsbChyZWdpb24pICU+JSANCiAgcmVuYW1lKHN0YXRlID0gcmVnaW9uLA0KICAgICAgICAgaWRwcyA9IGlkX3BzLCANCiAgICAgICAgIHBvcF9taW51c19pZHBzID0gcG9wdWxhdGlvbl9taW51c19pZF9wcywgDQogICAgICAgICBwaW5fMjAyMiA9IHZ1bG5lcmFibGVfZm9vZF9pbnNlY3VyZV9wZW9wbGVfaWRfcHMpICU+JSAgDQogIGZpbHRlcih0b3duc2hpcCAhPSAiVG90YWwiKSAlPiUgIA0KICBtdXRhdGVfYXQodmFycyhwb3BfbWludXNfaWRwczptb2RlcmF0ZWx5X3NldmVyZWx5KSwgfiBhcy5udW1lcmljKC4pKSAlPiUgDQogIG11dGF0ZShzdGF0ZSA9IHJlY29kZShzdGF0ZSwgIlNoYW4gRWFzdCIgPSAiU2hhbiAoRWFzdCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlNoYW4gTm9ydGgiID0gIlNoYW4gKE5vcnRoKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQXlleWF3YWR5IiA9ICJBeWV5YXJ3YWR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJTaGFuICgoc291dGgpKSIgPSAiU2hhbiAoU291dGgpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAiTmF5cHlpdGF3IiA9ICJOYXkgUHlpIFRhdyIpKSAlPiUgDQogIGxlZnRfam9pbih0b3duc2hpcHMsIGJ5ID0gYygidG93bnNoaXAiID0gInRvd25zaGlwX25hbWUiLCAic3RhdGUiID0gInN0YXRlX25hbWUiKSkgJT4lIA0KICByZWxvY2F0ZShhZG1pbjNfcGNvZGUpICU+JSByZWxvY2F0ZShhZG1pbjFfcGNvZGUpICU+JSANCiAgbXV0YXRlKHBjX3Z1bCA9IHBpbl8yMDIyIC8gdG90YWxfcG9wLA0KICAgICAgICAgcGluXzIwMjIgPSByb3VuZChwaW5fMjAyMiwgZGlnaXRzID0gMCkpICU+JSANCiAgbGVmdF9qb2luKHJlYWRfZXhjZWwoIkZTQyBQSU4gYW5kIFRhcmdldCBfY29tYmluZSBIUlAgYW5kIElFUlAgMjAyMS54bHN4IikgJT4lDQogICAgICAgICAgICAgIGNsZWFuX25hbWVzKCkgJT4lDQogICAgICAgICAgICAgIHNlbGVjdChhZG1pbjNfcGNvZGUgPSB0c3BfcGNvZGUsIHBpbl8yMDIxID0gcGluLCB0YXJnZXRfMjAyMSA9IHRhcmdldCksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHJlYWRfZXhjZWwoImZzX3RhcmdldHNfMjAyMS54bHN4IikgJT4lDQogICAgICAgICAgICAgIGNsZWFuX25hbWVzKCkgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QodG93bnNoaXAgPSB4MSwNCiAgICAgICAgICAgICAgICAgICAgIGhycF90YXJnZXRfaWRwc18yMDIxID0gaW50ZXJuYWxseV9kaXNwbGFjZWRfcGVyc29uc18xMiwNCiAgICAgICAgICAgICAgICAgICAgIGhycF90YXJnZXRfcmV0dXJuZWVzXzIwMjEgPSBpZHBfcmV0dXJuZWVzX3Jlc2V0dGxlZF9sb2NhbGx5X2ludGVncmF0ZWRfMTMsDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X3N0YXRlbGVzc19yYWtoaW5lXzIwMjEgPSBub25fZGlzcGxhY2VkX3N0YXRlbGVzc19wZW9wbGVfaW5fcmFraGluZV8xNCwNCiAgICAgICAgICAgICAgICAgICAgIGhycF90YXJnZXRfb3RoZXJfdnVsbmVyYWJsZV8yMDIxID0gb3RoZXJfdnVsbmVyYWJsZV9jcmlzaXNfYWZmZWN0ZWRfcGVvcGxlXzE1LA0KICAgICAgICAgICAgICAgICAgICAgaHJwX3RhcmdldF90b3RhbCA9IHRvdGFsXzE2KSAlPiUNCiAgICAgICAgICAgICAgbGVmdF9qb2luKHRvd25zaGlwcyAlPiUgIHNlbGVjdCh0b3duc2hpcF9uYW1lLCBhZG1pbjNfcGNvZGUpLCBieSA9IGMoInRvd25zaGlwIiA9ICJ0b3duc2hpcF9uYW1lIikpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC10b3duc2hpcCksDQogICAgICAgICAgICBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUNCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIA0KICBsZWZ0X2pvaW4ocmVhZF9leGNlbCgiRlNDIFBJTiBhbmQgVGFyZ2V0IF9jb21iaW5lIEhSUCBhbmQgSUVSUCAyMDIxLnhsc3giKSAlPiUNCiAgICAgICAgICAgICAgY2xlYW5fbmFtZXMoKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM19wY29kZSA9IHRzcF9wY29kZSwgaHJwX3ZlcnNpb24pLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgIA0KICBtdXRhdGUoaHJwX3ZlcnNpb24gPSByZWNvZGUoaHJwX3ZlcnNpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSFJQIDIwMjEiID0gImhycCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSFJQIEFkZGVuZHVtIiA9ICJpZXJwIikpICU+JSANCiAgbXV0YXRlKGFkbWluM19wY29kZSA9IGlmZWxzZShhZG1pbjNfcGNvZGUgPT0gIk1NUjAwNzAxNCIgJiBzdGF0ZSA9PSAiWWFuZ29uIiwgIk1NUjAxMzAwNiIsIGFkbWluM19wY29kZSksDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBpZmVsc2Uoc3RhdGUgPT0gIk1hZ3dheSIgJiB0b3duc2hpcCA9PSAiTWluaGxhIiwgIk1NUjAwOTAxMyIsIGFkbWluM19wY29kZSkpICU+JSAgDQogIHJlbmFtZSh0YXJnZXRfMjAyMiA9IHRhcmdldCkgJT4lIA0KICAjIFlhbmdvbiBzb21laG93IGhhcyBhbGwgdGhlaXIgdGFyZ2V0IGFuZCBwaW4gcmV2ZXJzZWQ/IA0KICBtdXRhdGUocGluX25ldyA9IGlmZWxzZShzdGF0ZSA9PSAiWWFuZ29uIiwgdGFyZ2V0XzIwMjIsIHBpbl8yMDIyKSwgIA0KICAgICAgICAgICAgICAgdGFyZ2V0X25ldyA9IGlmZWxzZShzdGF0ZSA9PSAiWWFuZ29uIiwgcGluXzIwMjIsIHRhcmdldF8yMDIyKSkNCg0KIyB0aGlzIGV4aXN0cyBmb3IgdGhlIEhSUCAvIG5vbi1IUlAgY29sdW1uIA0KaHJwMjAyMV9hZG0zX2xpc3QgPC0gcGluICU+JSBmaWx0ZXIoaHJwX3ZlcnNpb24gPT0gImhycCIpICU+JSBwdWxsKGFkbWluM19wY29kZSkNCg0KIyByZWFkaW5nIGluIDV3cw0KZnNjIDwtIHJlYWRfZXhjZWwoDQogICJGU0MgNVcgMjAyMSAtIEdFT0FETUlOU19maW5hbCAxOV9KYW4gdG8gRGVjIDIwMjEgSU0gQ29tYmluZWRfRHJhZnRfMjgwMTIwMjIueGxzeCIsDQogICAgICAgICAgICAgICAgICBzaGVldCA9ICJGU0MgNVcgQWN0aXZpdGVzIiwNCiAgICAgICAgICAgICAgICAgIHNraXAgPSA1KSAlPiUgDQogIGphbml0b3I6OmNsZWFuX25hbWVzKCkgJT4lIA0KICBzZWxlY3QobW9udGhfb2ZfaW1wbGVtZW50YXRpb246aHJwX3ZlcnNpb24pICU+JSANCiAgcmVuYW1lX2FsbCh+c3RyX3JlcGxhY2VfYWxsKC4sICJebnVtYmVyX29mXyIsICIiKSkgJT4lDQogIHJlbmFtZV9hbGwofnN0cl9yZXBsYWNlX2FsbCguLCAiXm51bWJlcl8iLCAiIikpICU+JSANCiAgcmVuYW1lKGFkbWluNF9wY29kZSA9IGFkbWluM19wY29kZSwgDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBhZG1pbjJfcGNvZGUsDQogICAgICAgICBiZW5lZmljaWFyaWVzID0gcmVhY2hlZF9iZW5lZmljaWFyaWVzLA0KICAgICAgICAgaG91c2Vob2xkcyA9IHJlYWNoZWRfaG91c2Vob2xkcywNCiAgICAgICAgIGJlbmVmaWNpYXJ5X3R5cGUgPSBiZW5lZmljaWFyaWVzX3R5cGUpICU+JSANCiAgbXV0YXRlKGluZHVzdHJpYWxfem9uZXMgPSByZXBsYWNlKGluZHVzdHJpYWxfem9uZXMsIGluZHVzdHJpYWxfem9uZXMgPT0gIk5vIiwgTkEpLA0KICAgICAgICAgZnJlcXVlbmN5ID0gcmVwbGFjZShmcmVxdWVuY3ksIGZyZXF1ZW5jeSA9PSAiTi9BIiwgTkEpKSAlPiUgDQogIG11dGF0ZShsb2NhdGlvbiA9IGNhc2Vfd2hlbihjYW1wICE9ICJOQSIgfiBjYW1wLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gaW5kdXN0cmlhbF96b25lcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpbGxhZ2Vfd2FyZF90b3duICE9ICJOQSIgfiB2aWxsYWdlX3dhcmRfdG93bikpICU+JSANCiAgbXV0YXRlKGxvY2F0aW9uX3R5cGUgPSBjYXNlX3doZW4oY2FtcCAhPSAiTkEiIH4gImNhbXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kdXN0cmlhbF96b25lcyAhPSAiTkEiIH4gImluZHVzdHJpYWxfem9uZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWxsYWdlX3dhcmRfdG93biAhPSAiTkEiIH4gInZpbGxhZ2Vfd2FyZF90b3duIiksDQogICAgICAgICBsb2NhdGlvbnNfZnV6enkgPSBzdHJfcmVwbGFjZV9hbGwobG9jYXRpb24sICJbWzpwdW5jdDpdXSIsICIgIikpICU+JQ0KICBtdXRhdGUodG90YWxfdmFsdWVfbW1rID0gdmFsdWVfcGVyX2hvdXNlaG9sZCAqIGhvdXNlaG9sZHMsDQogICAgICAgICBkYXRlICAgICAgICAgICAgPSBteShtb250aF9vZl9pbXBsZW1lbnRhdGlvbiksDQogICAgICAgICB1X2JlbiAgICAgICAgICAgPSBpZmVsc2UodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIsIGJlbmVmaWNpYXJpZXMsIDApKSAlPiUgDQogIG11dGF0ZShzdGF0ZSA9IGFzLmNoYXJhY3RlcihmY3RfcmVjb2RlKHN0YXRlLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2FjaGluIiA9ICJrYWNoaW4iKSksDQogICAgICAgICBmcmVxdWVuY3kgPSByZWNvZGUoZnJlcXVlbmN5LCAibW9udGhseSIgPSAiTW9udGhseSIpLA0KICAgICAgICAgdG93bnNoaXAgPSByZWNvZGUodG93bnNoaXAsICJreWF1a21lIiA9ICJLeWF1a21lIikpICU+JSANCiAgbXV0YXRlKG5ld192YWx1ZV9oaGQgPSB0b3RhbF92YWx1ZV91c2QgLyBob3VzZWhvbGRzLA0KICAgICAgICAgbmV3X3ZhbHVlX3BlcnNvbiA9IHRvdGFsX3ZhbHVlX3VzZCAvIGJlbmVmaWNpYXJpZXMsDQogICAgICAgICB1c2RfaGhkX2JpbiA9IA0KICAgICAgICAgICBjYXNlX3doZW4obmV3X3ZhbHVlX2hoZCA8IDEwIH4gIjwkMTAiLA0KICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlX2hoZCA+PSAxMCAmIG5ld192YWx1ZV9oaGQgPCAyMCB+ICI+PSQxMF88JDIwIiwNCiAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9oaGQgPj0gMjAgJiBuZXdfdmFsdWVfaGhkIDwgNDAgfiAiPj0kMjBfPCQ0MCIsDQogICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVfaGhkID49IDQwICYgbmV3X3ZhbHVlX2hoZCA8IDYwIH4gIj49JDQwXzwkNjAiLA0KICAgICAgICAgICAgICAgICAgICAgbmV3X3ZhbHVlX2hoZCA+PSA2MCAmIG5ld192YWx1ZV9oaGQgPCA4MCB+ICI+PSQ2MF88JDgwIiwNCiAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9oaGQgPj0gODAgJiBuZXdfdmFsdWVfaGhkIDwgMTAwIH4gIj49JDgwXzwkMTAwIiwNCiAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZV9oaGQgPj0gMTAwIH4gIj49JDEwMCIsDQogICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksDQogICAgICAgICB1c2RfaGhkX2JpbiA9IGZjdF9yZWxldmVsKHVzZF9oaGRfYmluLCBjKCI8JDEwIiwgIj49JDEwXzwkMjAiLCAiPj0kMjBfPCQ0MCIsICI+PSQ0MF88JDYwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PSQ2MF88JDgwIiwgIj49JDgwXzwkMTAwIiwgIj49JDEwMCIpKSkgJT4lIA0KICBtdXRhdGUoaHJwX2luZGljYXRvciA9DQogICAgICAgICAgcmVjb2RlKGhycF9pbmRpY2F0b3IsDQogICAgICAgICAgIk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZSIgPSANCiAgICAgICAgICAgICIxLk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZSIsDQogICAgICAgICAgIk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQsIGNvbnRyaWJ1dGluZyB0byBob3VzZWhvbGQgZm9vZCBzZWN1cml0eSIgPQ0KICAgICAgICAgICAgIjIuTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgYWdyaWN1bHR1cmUgYW5kIG90aGVyIGxpdmVsaWhvb2Qgc3VwcG9ydCIpKSAlPiUgDQogIG11dGF0ZShiZW5lZmljaWFyeV90eXBlID0gc3RyX3RyaW0oYmVuZWZpY2lhcnlfdHlwZSkpICU+JSANCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBhcy5jaGFyYWN0ZXIoZmN0X3JlY29kZShiZW5lZmljaWFyeV90eXBlLCANCiAgICAgICAgICAgICAgICJSYWtoaW5lIHN0YXRlbGVzcyIgPSAiTm9uLWRpc3BsYWNlZCBzdGF0ZWxlc3MgcGVvcGxlIGluIFJha2hpbmUiKSkpICU+JSANCiAgbXV0YXRlKGFjdGl2aXR5ID0gcmVjb2RlKGFjdGl2aXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgbW9udGhseSBmb29kIGJhc2tldHMgdGhyb3VnaCBpbi1raW5kIGFzc2lzdGFuY2UgdG8gYWN1dGVseSBmb29kIGluc2VjdXJlIHBvcHVsYXRpb24gaW4gcnVyYWwgYXJlYXMiID0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgbW9udGhseSBmb29kIGJhc2tldHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSB0ZWNobmljYWwgdHJhaW5pbmcgKGFncmljdWx0dXJlLCBsaXZlc3RvY2sgYnJlZWRpbmcsIGxpdmVsaWhvb2QpIiA9ICJQcm92aWRlIHRlY2huaWNhbCB0cmFpbmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIHN1cHBvcnQgZm9yIEluY29tZSBHZW5lcmF0aW5nIEFjdGl2aXRpZXMiID0gIlByb3ZpZGUgc3VwcG9ydCBmb3IgaW5jb21lIGdlbmVyYXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIHRvIGFjdXRlbHkgZm9vZCBpbnNlY3VyZSBwb3B1bGF0aW9uIGluIHJ1cmFsIGFyZWFzIiA9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJDYXNoIGZvciBXb3JrIC8gRm9vZCBmb3IgQXNzZXRzIGFjdGl2aXRpZXMiID0gIkNhc2ggZm9yIFdvcmsgLyBGb29kIGZvciBBc3NldHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBmaXNoZXJ5IGtpdHMgKGluLWtpbmQgLyBDQlQpIiA9ICJQcm92aWRlIGZpc2hlcnkga2l0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIGNyb3BzICYgdmVnZXRhYmxlcyBraXRzIChpbi1raW5kIC8gQ0JUKSIgPSAiUHJvdmlkZSBjcm9wcyAmIHZlZ2V0YWJsZXMga2l0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQcm92aWRlIGxpdmVzdG9jayBraXRzIChpbi1raW5kIC8gQ0JUKSIgPSAiUHJvdmlkZSBsaXZlc3RvY2sga2l0cyIpKSAlPiUgDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lcnMgPSByZWNvZGUoaW1wbGVtZW50aW5nX3BhcnRuZXJzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2F2ZSB0aGUgY2hpbGRyZW4iID0gIlNhdmUgdGhlIENoaWxkcmVuIikpICU+JSANCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUgPSANCiAgICAgICAgICAgaWZlbHNlKGltcGxlbWVudGluZ19wYXJ0bmVycyAlaW4lIGMoIkthdyBMYWggRm91bmRhdGlvbiIsICJIYWtoYSBCYXB0aXN0IEFzc29jaWF0aW9uIChIQkEpIiwgIkFya2FuIFJlc2VhcmNoIGFuZCBXYXRjaCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbGFpbmcgRGV2ZWxvcG1lbnQgTmV0d29yayIsICJNYW5ncm92ZSBTZXJ2aWNlIE5ldHdvcmsgKE1TTikiLCAiS3lhbCBTaW4gTWF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN3YW4gU2F1bmcgU2hpbiIsICJTZWluIExlaSBBeWV5YXIiKSwgIk5OR08iLCBpbXBsZW1lbnRpbmdfcGFydG5lcl90eXBlKSwNCiAgICAgICAgIGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUgPSANCiAgICAgICAgICAgaWZlbHNlKGltcGxlbWVudGluZ19wYXJ0bmVycyAlaW4lIGMoIlNpbmdsZSBUb3VjaCBQb2ludCBDb21wYW55IExpbWl0ZWQgKFNUUCkiLCAiTmVvIFByb3NwZWN0IENvbXBhbnkgTGltaXRlZCIpLCANCiAgICAgICAgICAgICAgICAgICJvdGhlciIsIGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUpLA0KICAgICAgICAgaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSA9IGlmZWxzZShpbXBsZW1lbnRpbmdfcGFydG5lcnMgPT0gIkhlbGVuIEtlbGxlciBJbnRlcm5hdGlvbmFsIiwgIklOR08iLCBpbXBsZW1lbnRpbmdfcGFydG5lcl90eXBlKSkgJT4lICANCiAgbXV0YXRlKGhycF9pZXJwID0gY2FzZV93aGVuKGFkbWluM19wY29kZSAlaW4lIGhycDIwMjFfYWRtM19saXN0IH4gImhycCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGUgPiAiMjAyMS0wNS0wMSIgfiAiaWVycCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAibm9uX2hycCIpKSAlPiUgDQogIG11dGF0ZShjb3ZpZF8xOV9yZXNwb25zZSA9IHJlY29kZShjb3ZpZF8xOV9yZXNwb25zZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8iID0gIm5vIiwgIlllcyIgPSAieWVzIiksDQogICAgICAgICAgICAgICBjb3ZpZF8xOV9yZXNwb25zZSA9IHJlcGxhY2VfbmEoY292aWRfMTlfcmVzcG9uc2UsICJubyIpKQ0KDQojIGJlbiBkYXRhc2V0IC0tIHRpZHkgZm9ybWF0IDVXcyBmb3IgYmVuZWZpY2lhcmllcyANCmJlbiA8LSBmc2MgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSAgDQogIHNlbGVjdChkYXRlLA0KICAgICAgICAgaW1wbGVtZW50aW5nX3BhcnRuZXJzLCBpbXBsZW1lbnRpbmdfcGFydG5lcl90eXBlLA0KICAgICAgICAgc3RhdGUsIHRvd25zaGlwLCB2aWxsYWdlX3dhcmRfdG93biwgbG9jYXRpb24sIGxvY2F0aW9uX3R5cGUsIGFkbWluMV9wY29kZSwgYWRtaW4zX3Bjb2RlLA0KICAgICAgICAgYWN0aXZpdHksIGFjdGl2aXR5X3N0YXR1cywgaHJwX2luZGljYXRvciwgYmVuZWZpY2lhcnlfdHlwZSwgDQogICAgICAgICBjaGlsZF9tYWxlLCBjaGlsZF9mZW1hbGUsIGFkdWx0X21hbGUsIGFkdWx0X2ZlbWFsZSwgZWxkZXJseV9tYWxlLCBlbGRlcmx5X2ZlbWFsZSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGNoaWxkX21hbGU6ZWxkZXJseV9mZW1hbGUsIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiZGlzYWdncmVnYXRpb24iLCB2YWx1ZXNfdG8gPSAiYmVuZWZpY2lhcmllcyIsIHZhbHVlc19kcm9wX25hID0gVFJVRSkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFLA0KICAgICAgICB0b3duc2hpcCA9IFRTLA0KICAgICAgICBhZG1pbjNfcGNvZGUgPSBUU19QQ09ERSkgJT4lIA0KIG11dGF0ZShhZG1pbjNfcGNvZGUgPSBpZmVsc2Uoc3RyX2RldGVjdCh0b3duc2hpcCwgIkhsYWluZ3RoYXJ5YSIpLCAiTU1SMDEzMDA4IiwgYWRtaW4zX3Bjb2RlKSkNCg0KIyBwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9hZG1pbjMgYm91bmRhcnkgb2xkIHZlcnNpb24vYWRtaW4zIGJvdW5kYXJ5IG9sZCB2ZXJzaW9uLnNocCIsIHF1aWV0ID0gVFJVRSkgJT4lIA0KIyAgIHJlbmFtZShzdGF0ZSA9IFNULCANCiMgICAgICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFLA0KIyAgICAgICAgICAgdG93bnNoaXAgPSBUUywNCiMgICAgICAgICAgIGFkbWluM19wY29kZSA9IFRTX1BDT0RFKSANCg0KIyBmb3IgcmVsZXZlbGxpbmcgLS0gdGhpcyBpcyBpbiBvcmRlciBvZiBiZW5lZmljaWFyaWVzDQpzcl9vcmQgPC0gYygiWWFuZ29uIiwgIlJha2hpbmUiLCAiTWFuZGFsYXkiLCAiQXlleWFyd2FkeSIsICJNYWd3YXkiLCAiS2FjaGluIiwgIlNoYW4gKE5vcnRoKSIsICJLYXlpbiIsDQogIk1vbiIsICJTYWdhaW5nIiwgIktheWFoIiwgIkNoaW4iLCAiU2hhbiAoU291dGgpIiwgIkJhZ28gKEVhc3QpIiwgIlRhbmludGhhcnlpIiwgIlNoYW4gKEVhc3QpIikNCg0KIyBmb3IgcHJpbnRpbmcgdGhlIHRhcmdldHMgb2YgdGhlIHBpbiANCnRhcmdldF9iZW5fMjAyMSA8LSBwaW4gJT4lICANCiAgc2VsZWN0KGFkbWluM19wY29kZSwgc3RhdGUsIHRvd25zaGlwLCB0YXJnZXRfMjAyMSkgJT4lIA0KICBmaWx0ZXIodGFyZ2V0XzIwMjEgPiAwKSAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIG11dGF0ZShwY19yZWFjaGVkID0gYmVuZWZpY2lhcmllcyAvIHRhcmdldF8yMDIxICogMTAwKSAlPiUgIA0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSANCg0KYGBgDQoNCg0KIyMgSW50cm9kdWN0aW9uDQoNClRoaXMgcmVwb3J0IGlzIGFuIG92ZXJ2aWV3IG9mIHRoZSBpbml0aWFsIG9ic2VydmF0aW9ucyBhbmQgYW5hbHlzaXMgcGVyZm9ybWVkIG9uIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIgNVdzIGRhdGEgZm9yIDIwMjE7IHRoZSBpc3N1ZXMgaWRlbnRpZmllZCBhbmQgYW5hbHlzaXMgaGF2ZSBiZWVuIGJyb2tlbiBpbnRvIGxhcmdlIGdyb3VwcyBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGZpcnN0IDQgY2hhcHRlcnMgLS0gZ2VvZ3JhcGhpY2FsIGNvdmVyYWdlLCBhY3Rpdml0aWVzIGFuZCBtb2RhbGl0aWVzLCBwYXJ0bmVycyBhbmQgYmVuZWZpY2lhcmllcy4gVGhpcyByZXBvcnQgZW5kcyB3aXRoIGEgYnJpZWYgc2VjdGlvbiBvbiBuZXh0IHN0ZXBzIGFuZCBhbiBpbnRlcmFjdGl2ZSByZWZlcmVuY2UgdGFibGUgYW5kIGludGVyYWN0aXZlIHJlZmVyZW5jZSBtYXBzLg0KDQpUaGUgRlNDIGhhcyBlbmRlYXZvdXJlZCB0byBwcm92aWRlIGFjdGlvbmFibGUgaW5mb3JtYXRpb24gYW5kIGJlbGlldmUgdGhhdCByZWxlYXNpbmcgdGhpcyByZXBvcnQgaXMgYSBuZWNlc3NhcnkgcGFydCBvZiBqdW1wLXN0YXJ0aW5nIHRoZSBwcm9jZXNzIG9mIHJlc29sdmluZyB0aGUgbW9yZSBwcmVzc2luZyBjb25jZXJucyBpZGVudGlmaWVkLiBGdXJ0aGVyIGFuYWx5c2lzIGlzIG1lcml0ZWQgaW4gc2V2ZXJhbCBhcmVhczsgYW5kIHRoaXMgd2lsbCBiZSB1bmRlcnRha2VuIG9uY2UgY29uc3VsdGF0aW9ucyB3aXRoIHBhcnRuZXJzIGhhdmUgYmVlbiBjb21wbGV0ZWQuIFVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLCBiZW5lZmljaWFyeSBmaWd1cmVzIGluIHRoaXMgcmVwb3J0IGFyZSB1bmlxdWUgYmVuZWZpY2lhcmllcywgYXMgb3Bwb3NlZCB0byBiZW5lZmljaWFyeSBmcmVxdWVuY2llcy4NCg0KPGJyPg0KDQojIyMgYS4gU3VtbWFyeSBvZiBrZXkgZmluZGluZ3MNCg0KKiBUaGUgMjAyMSByZXNwb25zZSB3YXMgKipza2V3ZWQgdG93YXJkcyBZYW5nb24gYW5kIFJha2hpbmUqKiAtLSBZYW5nb24gYW5kIFJha2hpbmUgNzglIG9mIHRoZSBiZW5lZmljaWFyaWVzIHJlYWNoZWQ7IDI0JSBvZiBhbGwgYmVuZWZpY2lhcmllcyBvcmlnaW5hdGUgZnJvbSBIbGFpbmd0aGFyeWEgdG93bnNoaXAgYWxvbmUgYW5kIHRoZSB0b3AgMTAgdG93bnNoaXBzIGFjY291bnQgZm9yIDc2JSBvZiBhbGwgYmVuZWZpY2lhcmllcyByZWFjaGVkLiANCg0KKiBGb3VyIG9mIHRoZSBlaWdodCBGb29kIFNlY3VyaXR5IGFjdGl2aXRpZXMgKG1vbnRobHkgZm9vZCBiYXNrZXRzLCBzdXBwb3J0IGZvciBpbmNvbWUgZ2VuZXJhdGlvbiwgbGl2ZXN0b2NrIGtpdHMgYW5kIGZpc2hlcnkga2l0cykgZXhwZXJpZW5jZWQgKipsYXJnZSByYW1wIHVwcyoqIGluIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBhZnRlciB0aGUgYWRkaXRpb24gb2YgdGhlIDIwMjEgSFJQIGFkZGVuZHVtOyBidXQgdGhlIGNhc2Vsb2FkcyBmb3IgdGhlIHByb3Zpc2lvbiBvZiBjYXNoLWJhc2VkIHRyYW5zZmVycyBhbmQgdGVjaG5pY2FsIHRyYWluaW5nIHdlcmUgbGFyZ2VseSBlc3RhYmxpc2hlZCBwcmlvciB0byAyMDIxIGFuZCBvbmx5IHNhdyBpbmNyZW1lbnRhbCBpbmNyZWFzZXMgaW4gYmVuZWZpY2lhcmllcyByZWFjaGVkIHRocm91Z2hvdXQgdGhlIHllYXIuIA0KDQoqICoqNjElKiogb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVjZWl2ZWQgc3VwcG9ydCB0aHJvdWdoIHRoZSBpbi1raW5kIGRlbGl2ZXJ5IG1vZGFsaXR5OyAqKjI1JSoqIG9mIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHdlcmUgcmVhY2hlZCBieSBjYXNoIHRyYW5zZmVycyAtLSBvZiBiZW5lZmljaWFyaWVzIHdobyByZWNlaXZlZCBjYXNoIHRyYW5zZmVycywgODQlIG9mIHRoZW0gd2VyZSByZWFjaGVkIHRocm91Z2ggZGlyZWN0IGNhc2ggcGF5bWVudHMuIA0KDQoqIFRoZSBtb3N0IGNvbW1vbiB0cmFuc2ZlciB2YWx1ZXMgLS0gaW4gdGVybXMgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIC0tIGFyZSAqKmJldHdlZW4gVVNEIDYwIGFuZCA4MCoqLCBpdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IGEgbm90IGluc2lnbmlmaWNhbnQgbnVtYmVyIG9mIGhvdXNlaG9sZHMgKGFib3V0IDglKSB3ZXJlIHJlYWNoZWQgYnkgY2FzaCB0cmFuc2ZlciBpbnRlcnZlbnRpb25zIHZhbHVlZCBhdCBVU0QgMTAwIHBlciBob3VzZWhvbGQgb3IgbW9yZS4gVGhlIGhpZ2hlc3QgYXZlcmFnZSBjYXNoIHRyYW5zZmVycyB3ZXJlIGZyb20gdGhlIHByb3Zpc2lvbiBvZiBsaXZlc3RvY2sga2l0cyBhbmQgdGhlIGxvd2VzdCBhdmVyYWdlcyBmcm9tIENhc2ggZm9yIHdvcmsvZm9vZCBmb3IgYXNzZXRzIGFjdGl2aXRpZXMgDQoNCiogQXJvdW5kIDU0JSBvZiBiZW5lZmljaWFyeSBob3VzZWhvbGRzIGhhdmUgcmVjZWl2ZWQgNTAlIG9yIG1vcmUgb2YgdGhlICoqTWluaW11bSBFeHBlbmRpdHVyZSBCYXNrZXQgKE1FQikqKiBmb3IgZm9vZCBmb3IgdGhlIG1vbnRocyB0aGV5IHdlcmUgY292ZXJlZC4gQWJvdXQgMTAlIG9mIGFsbCBiZW5lZmljaWFyeSBob3VzZWhvbGRzIGZvciBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIHJlY2VpdmVkIHVuZGVyIFVTRCAyMCBwZXIgbW9udGggKGxlc3MgdGhhbiAxMCUgb2YgdGhlIE1FQikgYW5kIDIzJSBvZiBob3VzZWhvbGRzIHJlY2VpdmVkIGJldHdlZW4gVVNEIDIwIGFuZCBVU0QgNDAgKDIyJSBvZiB0aGUgTUVCKS4gDQoNCiogT2YgdGhlIHBhcnRuZXJzIHdobyByZXBvcnRlZCBpbiB0aGUgNVdzLCAqKjYyIHdlcmUgaW1wbGVtZW50aW5nIHBhcnRuZXJzKio7IDI3IHBhcnRuZXJzIGNsYXNzaWZpZWQgdGhlbXNlbHZlcyBhcyByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucywgdGhvdWdoIDIzIG9mIHRoZXNlIHdlcmUgYWxzbyBpbXBsZW1lbnRpbmcgcGFydG5lcnMuIEEgdG90YWwgb2YgNjYgdW5pcXVlIHBhcnRuZXJzIHJlcG9ydGVkIGluIHRoZSA1V3MgZHVyaW5nIDIwMjEuDQoNCiogT25seSA4IGltcGxlbWVudGluZyBwYXJ0bmVycyBoYXZlIGEgcHJlc2VuY2UgaW4gbW9yZSB0aGFuIDEwIHRvd25zaGlwcywgd2l0aCBvbmx5IDEzIGJlaW5nIHByZXNlbnQgaW4gbW9yZSB0aGFuIDUgdG93bnNoaXBzLiAqKjc4JSBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYXJlIHByZXNlbnQgaW4gNSBvciBsZXNzIHRvd25zaGlwcyoqLiAzNCBpbXBsZW1lbnRpbmcgcGFydG5lcnMgaGF2ZSByZWFjaGVkIGxlc3MgdGhhbiAxMCwwMDAgYmVuZWZpY2lhcmllcyBhbmQgdGhlIG1lZGlhbiBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVycyBpcyA2LDExOA0KDQoqICoqQWdlIGFuZCBzZXgtZGlzYWdncmVnYXRlZCBiZW5lZmljaWFyeSBmaWd1cmVzKiogYXJlIG9uZSBvZiB0aGUgbW9zdCBrZXkgcGllY2VzIG9mIG1pc3NpbmcgZGF0YSBpbiB0aGUgNVcgZGF0YXNldDsgdmFsdWVzIGhhdmUgYmVlbiBsYXJnZWx5IGJhY2tmaWxsZWQgZnJvbSBjZW5zdXMgZGF0YSBhbmQgZG8gbm90IHByb3ZpZGUgYW4gYWNjdXJhdGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBvcHVsYXRpb24gcmVhY2hlZC4gDQoNCiogKio4Mi42OCUgb2YgYmVuZWZpY2lhcmllcyBhcmUgZnJvbSB0aGUgaG9zdC9sb2NhbCBjb21tdW5pdHkqKiwgOS4wMiUgYXJlIHN0YXRlbGVzcyBwZXJzb25zIGZyb20gUmFraGluZSBhbmQgOC4yNCUgYXJlIElEUHMuIFJldHVybmVlcyBhcmUgdGhlIHJhcmVzdCB0eXBlIG9mIGJlbmVmaWNpYXJ5IHJlYWNoZWQsIGZvcm1pbmcgb25seSAwLjA3JSBvZiBhbGwgYmVuZWZpY2lhcmllcyByZWFjaGVkLg0KDQoqIDQ5JSBvZiBiZW5lZmljaWFyaWVzIG9mIG1vbnRobHkgYWN0aXZpdGllcyBleHBlcmllbmNlZCAqKmdhcHMgb3IgZGVsYXlzIGluIG1vbnRobHkgcHJvZ3JhbW1pbmcqKiwgd2l0aCB0aGUgbW9zdCBjb21tb24gZGVsYXkgYmVpbmcgMyBtb250aHMuIEdhcHMgaW4gbW9udGhseSBwcm9ncmFtbWluZyB3ZXJlIGV4cGVyaWVuY2VkIGluIDM5IHRvd25zaGlwcywgd2l0aCB0aGUgbWFqb3JpdHkgb3JnaW5hdGluZyBmcm9tIEthY2hpbiwgQXlleWFyd2FkeSBhbmQgUmFraGluZS4NCg0KKiBGb29kIFNlY3VyaXR5IENsdXN0ZXIgcGFydG5lcnMgYXJlICoqbm90IHdlbGwtcG9zaXRpb25lZCB0byBjb3ZlciB0aGUgMjAyMiBwb3B1bGF0aW9uIGluIG5lZWQqKi4gUGFydG5lcnMgYXJlIGxhcmdlbHkgY29uY2VudHJhdGVkIGluIEthY2hpbiwgUmFraGluZSBhbmQgWWFuZ29uLCB3aXRoIG9ubHkgb25lIHBhcnRuZXIgcHJlc2VudCBpbiBTaGFuIChFYXN0KSBhbmQgdHdvIGluIFRhbmludGhhcnlpLiBPdmVyYWxsLCA1OCUgb2YgdG93bnNoaXBzLCBjb250YWluaW5nIDQ2JSBvZiB0aGUgMjAyMiBQSU4sIGRvIG5vdCBoYXZlIGFueSBwYXJ0bmVycyBwcmVzZW50Lg0KDQo8YnI+PGJyPg0KDQojIyMgYi4gQWNoaWV2ZW1lbnRzIHJlbGF0ZWQgdG8gdGhlIEhSUCBhbmQgSUVSUA0KDQpgYGB7ciBkZi1ocnAtdmVyc2lvbi10YWJ9DQpocnBfdmVyc2lvbl90YWIgPC0gZnNjICU+JSANCiAgZ3JvdXBfYnkoaHJwX2llcnApICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odV9iZW4sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksDQogICAgICAgICAgICBpbXBsZW1lbnRpbmdfcGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycykpICU+JSANCiAgcmVuYW1lKGhycF92ZXJzaW9uID0gaHJwX2llcnApICU+JQ0KICBsZWZ0X2pvaW4ocGluICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKCFpcy5uYShocnBfdmVyc2lvbikpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoaHJwX3ZlcnNpb24pICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHRhcmdldF8yMDIxID0gcm91bmQoc3VtKHRhcmdldF8yMDIxLCBuYS5ybSA9IFRSVUUpKSksIGJ5ID0gImhycF92ZXJzaW9uIikgJT4lIA0KICBtdXRhdGUocGNfb2ZfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgcmVsb2NhdGUoYmVuZWZpY2lhcmllcywgLmFmdGVyID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIHJlbG9jYXRlKHBjX29mX2JlbiwgLmFmdGVyID0gYmVuZWZpY2lhcmllcykNCmBgYA0KDQpUaG91Z2ggdGhpcyBkb2N1bWVudCBpcyBub3QgaW50ZW5kZWQgdG8gcmVwb3J0IG9yIGZvY3VzIG9uIHNvbGVseSBIUlAtcmVsYXRlZCBhY3Rpdml0aWVzIC0tIGl0IHRvIGJlIGltcG9ydGFudCB0byBhbmFseXNlIHRoZSBlbnRpcmV0eSBvZiBhbGwgRm9vZCBTZWN1cml0eSBhY3Rpdml0aWVzIHJlcG9ydGVkIGluIDIwMjEgLS0gdGhpcyBwcmVsaW1pbmFyeSBzZWN0aW9uIGNvbnRhaW5zIGEgYnJpZWYgc3VtbWFyeSBvZiBIUlAgYW5kIEhSUC1yZWxhdGVkIGFjaGlldmVtZW50cy4gSW4gMjAyMSwgYHIgZmlsdGVyKGhycF92ZXJzaW9uX3RhYiwgaHJwX3ZlcnNpb24gPT0gImhycCIpICU+JSBwdWxsKHBjX29mX2JlbilgJSBvZiByZWFjaGVkIGJlbmVmaWNpYXJpZXMgd2VyZSByZWxhdGVkIHRvIHRoZSBvcmlnaW5hbCBIUlAgYW5kIGByIGZpbHRlcihocnBfdmVyc2lvbl90YWIsIGhycF92ZXJzaW9uID09ICJpZXJwIikgJT4lIHB1bGwocGNfb2ZfYmVuKWAlIHdlcmUgcmVsYXRlZCB0byB0aGUgSFJQIGFkZGVuZHVtOg0KDQpgYGB7ciBocnAtdmVyc2lvbi10YWJsZX0NCiMgdG9vIG11Y2ggbWFudWFsIGNhbGN1bGF0aW9uIGluIHRoaXMgdGFibGUgLS0gSSBrbm93IHlvdSBkb24ndCBoYXZlIHRpbWUgbm93LCBidXQgeW91IG5lZWQgdG8gZml4IHRoaXMgYXQgc29tZSBwb2ludA0KaHJwX3ZlcnNpb25fdGFiICU+JSAgDQogIHJiaW5kKGZzYyAlPiUgIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHVfYmVuLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSksDQogICAgICAgICAgICAgIGltcGxlbWVudGluZ19wYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSkgJT4lIA0KICAgICAgbXV0YXRlKGhycF92ZXJzaW9uID0gaWZlbHNlKGlzLm51bWVyaWMoYmVuZWZpY2lhcmllcyksICJ0b3RhbCIsICIiKSwNCiAgICAgICAgICAgICBwY19vZl9iZW4gPSBpZmVsc2UoaXMubnVtZXJpYyhiZW5lZmljaWFyaWVzKSwgMTAwLjAwLCAwKSwgDQogICAgICAgICAgICAgdGFyZ2V0XzIwMjEgPSA2MDEyMzUgKyAyMTY3MTE0KSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfdGFyZ2V0ID0gaWZlbHNlKGhycF92ZXJzaW9uID09ICJ0b3RhbCIsIHJvdW5kKChiZW5lZmljaWFyaWVzIC0gNDc1NDQ0KSAvIHRhcmdldF8yMDIxICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChiZW5lZmljaWFyaWVzIC8gdGFyZ2V0XzIwMjEgKiAxMDAsIGRpZ2l0cyA9IDIpKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkJlbmVmaWNpYXJpZXMsIHRvd25zaGlwcyBhbmQgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGJ5IEhSUCwgSFJQIGFkZGVuZHVtIGFuZCBub24tSFJQIGFjdGl2aXRpZXMiLA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSAgDQogIGZvb3Rub3RlKCJgcGNfb2ZfdGFyZ2V0YCBvbmx5IHRha2VzIGludG8gYWNjb3VudCB0aGUgMiw3ODUsNTI0IEhSUCBhbmQgSUVSUCBiZW5lZmljaWFyaWVzIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KIyBwYW5kZXIoY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzLCB0b3duc2hpcHMgYW5kIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSBIUlAsIEhSUCBhZGRlbmR1bSBhbmQgbm9uLUhSUCBhY3Rpdml0aWVzIikNCg0KYGBgDQoNCg0KPGJyPg0KDQpgYGB7ciBkZi1ocnAtYWN0fQ0KaHJwX2FjdCA8LSBmc2MgJT4lICANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiICYgaHJwX2llcnAgIT0gIm5vbl9ocnAiKSAlPiUgDQogIHN1bV9iZW4oYWN0aXZpdHkpICU+JSANCiAgbXV0YXRlKHBjX29mX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KDQpgYGANCg0KDQpUaGUgcHJvdmlzaW9uIG9mIG1vbnRobHkgZm9vZCBiYXNrZXRzIHdhcyB0aGUgc2luZ2xlIGxhcmdlc3QgYWN0aXZpdHksIGZvcm1pbmcgYHIgZmlsdGVyKGhycF9hY3QsIGFjdGl2aXR5ID09ICJQcm92aWRlIG1vbnRobHkgZm9vZCBiYXNrZXRzIikgJT4lIHB1bGwocGNfb2ZfYmVuKWAlIG9mIGFsbCByZWFjaGVkIGJlbmVmaWNpYXJpZXMuIFRoaXMgd2FzIGZvbGxvd2VkIGJ5IHRoZSBwcm92aXNpb24gb2YgbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyBhbmQgdGhlIHByb3Zpc2lvbiBvZiBjcm9wIGFuZCB2ZWdldGFibGUga2l0cy4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1ocnAtaWVycC1hY3Rpdml0aWVzfQ0KDQojIEkgZG9uJ3QgdGhpbmsgdGhpcyBpcyBuZWNlc3NhcnkgDQpocnBfYWN0X29yZCA8LSBmc2MgJT4lIA0KIGZpbHRlcihocnBfaWVycCAhPSAibm9uX2hycCIgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KIHN1bV9iZW4oYWN0aXZpdHkpDQoNCmZzYyAlPiUgIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoaHJwX2llcnAsIGFjdGl2aXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShocnBfaWVycCA9IHJlY29kZShocnBfaWVycCwgImhycCIgPSAiSFJQIiwgImllcnAiID0gIklFUlAiLCAibm9uX2hycCIgPSAibm9uX0hSUCIpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBocnBfaWVycCwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9IUlBfSUVSUCA9IEhSUCArIElFUlAsDQogICAgICAgICBwY19vZl90b3RhbCA9IHJvdW5kKHRvdGFsX0hSUF9JRVJQIC8gc3VtKHRvdGFsX0hSUF9JRVJQKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKHBjX29mX3RvdGFsKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSBhY3Rpdml0eSwgYnkgSFJQIHZlcnNpb24iLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogICMgY29sdW1uX3NwZWMoNiwgY29sb3IgPSBzcGVjX2NvbG9yKGhycF9hY3Rfb3JkJGJlbmVmaWNpYXJpZXNbMTo4XSwgZW5kID0gMC44LCBkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gIkciKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgIA0KICBmb290bm90ZSgiYHBjX29mX3RvdGFsYCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBIUlAgYW5kIElFUlAgYmVuZWZpY2lhcmllczsgbm9uLUhSUCBmaWd1cmVzIGFyZSBqdXN0IGZvciByZWZlcmVuY2UiLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQojIHBhbmRlcihjYXB0aW9uID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSBhY3Rpdml0eSwgYnkgSFJQIHZlcnNpb24iKQ0KYGBgDQoNCjxicj4NCg0KQXMgYSBub3RlLCBsZXNzIHRoYW4gNyUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCB3ZXJlIGFzc29jaWF0ZWQgd2l0aCBDT1ZJRC0xOSByZXNwb25zZSBhY3Rpdml0aWVzLCBwZXJoYXBzIGluZGljYXRpbmcgdGhhdCBDT1ZJRC1yZWxhdGVkIGFjdGl2aXRpZXMgaGF2ZSBiZWVuIGxhcmdlbHkgbWFpbnN0cmVhbWVkLiANCg0KYGBge3J9DQpmc2MgJT4lIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBzdW1fYmVuMihocnBfaWVycCwgY292aWRfMTlfcmVzcG9uc2UpICU+JSANCiAgbXV0YXRlKGhycF9pZXJwID0gcmVjb2RlKGhycF9pZXJwLCAiaHJwIiA9ICJIUlAiLCAiaWVycCIgPSAiSUVSUCIsICJub25faHJwIiA9ICJub25fSFJQIikpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGhycF9pZXJwLCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgbXV0YXRlKHRvdGFsX2JlbiA9IElFUlAgKyBIUlAgKyBub25fSFJQLCANCiAgICAgICAgIHBjX29mX3RvdGFsID0gcm91bmQodG90YWxfYmVuIC8gc3VtKHRvdGFsX2JlbikgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgIA0KICBrYWJsZShjYXB0aW9uID0gIkNPVklELTE5IHJlc3BvbnNlIGJ5IEhSUCB2ZXJzaW9uIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoKSAlPiUgDQogIGZvb3Rub3RlKCJBbGwgYmVuZWZpY2lhcmllcyBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gYHRvdGFsX2JlbmAiLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQpgYGANCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4gR2VvZ3JhcGhpY2FsIGNvdmVyYWdlDQoNCiMjIyAxLjEgQ29tcGFyaW5nIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBhbmQgMjAyMSBQSU4gYnkgc3RhdGUgYW5kIHJlZ2lvbg0KDQpBIHRvdGFsIG9mIGByIHN1bShiZW4kYmVuZWZpY2lhcmllcykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHVuaXF1ZSBiZW5lZmljaWFyaWVzIGhhdmUgYmVlbiByZWFjaGVkIGFjcm9zcyB0aGUgY291bnRyeSwgb2Ygd2hpY2gsIGByIGZpbHRlcihocnBfdmVyc2lvbl90YWIsIGhycF92ZXJzaW9uICVpbiUgYygiaHJwIiwgImllcnAiKSkgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnRhaW5lZCB0byBIUlAgYW5kIElFUlAgYWN0aXZpdGllcyBhbmQgdG93bnNoaXBzIGFuZCBgciBmaWx0ZXIoaHJwX3ZlcnNpb25fdGFiLCBocnBfdmVyc2lvbiA9PSAibm9uX2hycCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIG5vbi1IUlAuIE92ZXJhbGwsIGByIHJvdW5kKChmaWx0ZXIoZnNjLCBocnBfaWVycCAlaW4lIGMoImhycCIsICJpZXJwIikpICU+JSB7c3VtKC4kdV9iZW4sIG5hLnJtID0gVFJVRSl9KSAvIChzdW0ocGluJHRhcmdldF8yMDIxKSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgb2YgdGhlIHRhcmdldHRlZCBgciBzdW0ocGluJHRhcmdldF8yMDIxKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyBpbiB0aGUgSFJQL0lFUlAgd2VyZSByZWFjaGVkLiANCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LXN0YXRlLWJlbmVmaWNpYXJpZXMtcGlufQ0KIyBjaGFuZ2UgdGhlIGNvbG91cnMgLS0gSSByZWFsbHkgZG9uJ3QgbGlrZSB0aGVzZSBjb2xvdXJzIA0KDQpwaW4gJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IGlmZWxzZShpcy5uYShiZW5lZmljaWFyaWVzKSwgMCwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgdGFyZ2V0XzIwMjEgPSBzdW0odGFyZ2V0XzIwMjEpLCANCiAgICAgICAgICAgIHBpbl8yMDIxID0gc3VtKHBpbl8yMDIxKSkgJT4lIA0KICBmaWx0ZXIocGluXzIwMjEgPiAwIHwgYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgcGl2b3RfbG9uZ2VyKC1zdGF0ZSwgbmFtZXNfdG8gPSAidHlwZSIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZmN0X3JlbGV2ZWwoc3RhdGUsIHNyX29yZCksIHkgPSB2YWx1ZSwgZmlsbCA9IGZjdF9yZWxldmVsKHR5cGUsIGMoImJlbmVmaWNpYXJpZXMiLCAidGFyZ2V0XzIwMjEiLCAicGluXzIwMjEiKSkpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAiRSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQodmp1c3QgPSAwLjQsIGFuZ2xlID0gNzApKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIkZvb2Qgc2VjdXJpdHkgYmVuZWZpY2lhcmllcyBhbmQgcGVvcGxlIGluIG5lZWQgKDIwMjEpIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTb21lIHN0YXRlcy9yZWdpb25zIGRpZCBub3QgaGF2ZSBzcGVjaWZpYyBIUlAvSUVSUCB0YXJnZXRzIikgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMDAwMDAwLCBieSA9IDIwMDAwMCksIGxhYmVscyA9IGNvbW1hKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAxLjIgVGFibGUgb2YgYmVuZWZpY2lhcmllcyBhbmQgUElOIGJ5IHN0YXRlIGFuZCByZWdpb24NCg0KYGBge3IgdGFibGUtYmVuZWZpY2lhcmllcy1waW4tc3RhdGV9DQoNCnN0YXRlX2Jlbl9vcmQgPC0gZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9iZW4gPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGAlX29mX3RvdGFsX2JlbmAgPSByb3VuZCh0b3RhbF9iZW4gLyBzdW0odG90YWxfYmVuKSAqIDEwMCwgZGlnaXRzID0gMikpJT4lIA0KICBhcnJhbmdlKGRlc2ModG90YWxfYmVuKSkNCg0KZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShIUlBfYmVuID0gc3VtKGJlbmVmaWNpYXJpZXNbaHJwX2llcnAgPT0gImhycCJdKSwNCiAgICAgICAgICAgIElFUlBfYmVuID0gc3VtKGJlbmVmaWNpYXJpZXNbaHJwX2llcnAgPT0gImllcnAiXSksDQogICAgICAgICAgICBub25fSFJQX2JlbiA9IHN1bShiZW5lZmljaWFyaWVzW2hycF9pZXJwID09ICJub25faHJwIl0pLCANCiAgICAgICAgICAgIHRvdGFsX2JlbiA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfdG90YWxfYmVuYCA9IHJvdW5kKHRvdGFsX2JlbiAvIHN1bSh0b3RhbF9iZW4pICogMTAwLCBkaWdpdHMgPSAyKSklPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9iZW4pKSAlPiUgDQogIGtibChjYXB0aW9uID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCAoZGVzYy4pIGJ5IHN0YXRlL3JlZ2lvbiIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKGxpZ2h0YWJsZV9vcHRpb25zID0gYygic3RyaXBlZCIpKSAlPiUgDQogIGNvbHVtbl9zcGVjKDYsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9IHNwZWNfY29sb3Ioc3RhdGVfYmVuX29yZCRgJV9vZl90b3RhbF9iZW5gWzE6MTZdLCBlbmQgPSAwLjgsIGRpcmVjdGlvbiA9IC0xKSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkFsbCBiZW5lZmljaWFyaWVzIGhhdmUgYmVlbiBpbmNsdWRlZCBpbiB0aGlzIHRhYmxlLCByZWdhcmRsZXNzIG9mIHRoZWlyIGluY2x1c2lvbiBpbiB0aGUgSFJQL0lFUlAiLA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQojIHBhbmRlcihjYXB0aW9uID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCAoZGVzYy4pIGJ5IHN0YXRlL3JlZ2lvbiIpDQoNCmBgYA0KDQo8YnI+DQpUaGUgcmVzcG9uc2UgaXMgZmFpcmx5IHNrZXdlZCBhdCB0aGUgc3RhdGUvcmVnaW9uIGxldmVsLiBZYW5nb24gYW5kIFJha2hpbmUgZm9ybSBgciByb3VuZChmaWx0ZXIoZnNjLCBzdGF0ZSAlaW4lIGMoIllhbmdvbiIsICJSYWtoaW5lIikgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0gLyBmaWx0ZXIoZnNjLCB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0gKiAxMDApYCUgb2YgdGhlIGJlbmVmaWNpYXJpZXMgcmVhY2hlZC4gQmVuZWZpY2lhcmllcyBmcm9tIFJha2hpbmUgd2VyZSBtb3N0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBIUlAsIHdoaWxzdCBiZW5lZmljaWFyaWVzIGZyb20gWWFuZ29uIHdlcmUgbW9zdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgSUVSUC4gDQoNCjxicj48YnI+DQoNCiMjIyAxLjMgVG93bnNoaXAtbGV2ZWwgZGlzdHJpYnV0aW9uIG9mIGJlbmVmaWNpYXJpZXMNCg0KDQpKdXN0IGFzIHRoZSByZXNwb25zZSBpcyBoZWF2aWx5IHdlaWdodGVkIHRvd2FyZHMgWWFuZ29uIGFuZCBSYWtoaW5lIGF0IHRoZSBzdGF0ZSBhbmQgcmVnaW9uIGxldmVsLCB0aGUgc2FtZSBpcyBhbHNvIHRydWUgYXQgdGhlIHRvd25zaGlwIGxldmVsLiBUaGVzZSAxMCB0b3duc2hpcHMgYmVsb3cgYXJlIHdoZXJlIDc2JSBvZiBhbGwgRlNDIGJlbmVmaWNpYXJpZXMuIA0KDQpgYGB7ciB0YWJsZS10b3AtdG93bnNoaXBzLWJlbmVmaWNpYXJpZXN9DQojIGNoZWNrIHRoZSBwYXJhZ3JhcGggdGV4dCBhYm92ZSBpZiB5b3UgcmVydW4gdGhlIHJlcG9ydCBvbiBuZXcgZGF0YSANCnRzcF9vcmQgPC0gZnNjICU+JSAgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBncm91cF9ieSh0b3duc2hpcCkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfYmVuID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZSh0b3duc2hpcCA9IGNhc2Vfd2hlbih0b3RhbF9iZW4gPiA0NjYwNyB+IHRvd25zaGlwLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiT3RoZXIgMTQxIHRvd25zaGlwcyIpKSAlPiUgDQogIGdyb3VwX2J5KHRvd25zaGlwKSAlPiUgDQogIHN1bW1hcmlzZV9hbGwoLmZ1bnMgPSBzdW0pICU+JSBhcnJhbmdlKGRlc2ModG90YWxfYmVuKSkNCg0KZnNjICU+JSAgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBncm91cF9ieSh0b3duc2hpcCkgJT4lIA0KICBzdW1tYXJpc2UoSFJQX2JlbiA9IHN1bShiZW5lZmljaWFyaWVzW2hycF9pZXJwID09ICJocnAiXSksDQogICAgICAgICAgICBJRVJQX2JlbiA9IHN1bShiZW5lZmljaWFyaWVzW2hycF9pZXJwID09ICJpZXJwIl0pLA0KICAgICAgICAgICAgbm9uX0hSUF9iZW4gPSBzdW0oYmVuZWZpY2lhcmllc1tocnBfaWVycCA9PSAibm9uX2hycCJdKSwgDQogICAgICAgICAgICB0b3RhbF9iZW4gPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKHRvd25zaGlwID0gY2FzZV93aGVuKHRvdGFsX2JlbiA+IDQ2NjA3IH4gdG93bnNoaXAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJPdGhlciAxNDEgdG93bnNoaXBzIikpICU+JSANCiAgZ3JvdXBfYnkodG93bnNoaXApICU+JSANCiAgc3VtbWFyaXNlX2FsbCguZnVucyA9IHN1bSkgJT4lIA0KICBtdXRhdGUoYCVfb2ZfdG90YWxfYmVuYCA9IHJvdW5kKHRvdGFsX2JlbiAvIHN1bSh0b3RhbF9iZW4pICogMTAwLCBkaWdpdHMgPSAyKSklPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9iZW4pKSAlPiUNCiAga2JsKGNhcHRpb24gPSAiVG9wIDEwIHRvd25zaGlwcyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgKGRlc2MpIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBjb2x1bW5fc3BlYyg2LCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBzcGVjX2NvbG9yKHRzcF9vcmQkdG90YWxfYmVuWzE6MTFdLCBlbmQgPSAwLjgsIGRpcmVjdGlvbiA9IC0xKSkgJT4lDQogIGthYmxlX2NsYXNzaWNfMihsaWdodGFibGVfb3B0aW9ucyA9IGMoInN0cmlwZWQiKSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkFsbCBiZW5lZmljaWFyaWVzIGhhdmUgYmVlbiBpbmNsdWRlZCBpbiBgdG90YWxfYmVuYCwgcmVnYXJkbGVzcyBvZiB0aGVpciBpbmNsdXNpb24gaW4gdGhlIEhSUC9JRVJQIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQoNCg0KDQpgYGANCg0KPGJyPg0KDQpgciBiZW4gJT4lIHNlbGVjdChhZG1pbjNfcGNvZGUpICU+JSBkaXN0aW5jdCgpICU+JSBucm93KClgIHRvd25zaGlwcyBvdmVyYWxsIGhhdmUgYmVlbiByZWFjaGVkIGJ5IGZvb2Qgc2VjdXJpdHkgYWN0aXZpdGllcyBpbiB0aGUgZmlyc3QgdGhyZWUtcXVhcnRlcnMgb2YgMjAyMS4gVGhpcyBpcyBgciByb3VuZChiZW4gJT4lIHNlbGVjdCh0b3duc2hpcCkgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKSAvIG5yb3codG93bnNoaXBzKSAqIDEwMCwgZGlnaXRzID0gMilgJSB0aGUgMzMwIHRvd25zaGlwcyBpbiB0aGUgY291bnRyeS4gYHIgZmlsdGVyKGZzYywgaHJwX2llcnAgJWluJSBjKCJocnAiLCAiaWVycCIpKSAlPiUgZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSAlPiUgbnJvdygpYCB0b3duc2hpcHMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgSFJQL0lFUlAgYWN0aXZpdGllcy4gDQoNCkl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIDIwMjEgdGFyZ2V0cyAtLSBlc3BlY2lhbGx5IHRob3NlIGZvciB0aGUgSUVSUCAtLSB3ZXJlIGRldmVsb3BlZCBtb3JlIG9mIGFzIGFuIGFwcHJveGltYXRpb24gb2YgcmVzcG9uc2UgY2FwYWNpdGllcyByYXRoZXIgdGhhbiBiZWluZyBlc3RpbWF0ZXMgcmVsYXRlZCB0byBhbnkgbWVhc3VyZSBvZiB2dWxuZXJhYmlsaXR5LiBBZGRpdGlvbmFsbHksIG5vdCBhbGwgdG93bnNoaXBzIHRhcmdldHRlZCBhcyBwYXJ0IG8gdGhlIElFUlAgaGF2ZSBzcGVjaWZpYyB0YXJnZXRzOiBmb3IgaW5zdGFuY2UsIG5laXRoZXIgTnlhdW5nLVUgbm9yIE15aW5neWFuIChib3RoIGluIE1hbmRhbGF5KSBmcm9tIHRoZSB0YWJsZSBhYm92ZSBoYWQgc3BlY2lmaWMgdGFyZ2V0cy4NCg0KVG8gbW9tZW50YXJpbHkgbmFycm93IGRvd24gdGhlIGZvY3VzIHRvIHRoZSA1NSB0b3duc2hpcHMgd2l0aCBzcGVjaWZpYyBIUlAgb3IgSUVSUCB0YXJnZXRzLCB0aGVyZSBpcyBzdWJzdGFudGlhbCB2YXJpYW5jZSBpbiB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IHRoYXQgaGFzIGJlZW4gcmVhY2hlZC4gSGxhaW5ndGhhcnlhJ3MgYmVuZWZpY2lhcnkgZmlndXJlcyBhcmUgMzc4JSBvZiBpdHMgZXN0YWJsaXNoZWQgdGFyZ2V0LCB3aGVyZWFzIEhwYXB1biBpbiBLYXlpbiBhbmQgS3lldGhpIGluIFNoYW4gaGFkIGJlZW4gdGFyZ2V0dGVkIHNpbmNlIHRoZSBpbml0aWFsIEhSUCBhbmQgaGF2ZSBub3QgYmVlbiByZWFjaGVkIGJ5IGFueSBGU0MgYWN0aXZpdGllczsgYWRkaXRpb25hbGx5LCBEYWdvbiBNeW90aGl0IChOb3J0aCksIEluc2VpbiBhbmQgQ2hhbmF5ZXRoYXphbiBpbiBZYW5nb24gd2VyZSB0YXJnZXR0ZWQgaW4gdGhlIElFUlAgYW5kIGFsc28gaGF2ZSBub3QgYmVlbiByZWFjaGVkLg0KDQoNCmBgYHtyIGRhdGFzZXQtdHMtdGFyZ2V0LXJlYWNoZWR9DQoNCnRzX3RhcmdldF9yZWFjaGVkIDwtIHBpbiAlPiUgIA0KICBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBzdGF0ZSwgdG93bnNoaXAsIHRhcmdldF8yMDIxKSAlPiUgDQogIGZpbHRlcih0YXJnZXRfMjAyMSA+IDApICU+JSANCiAgbGVmdF9qb2luKGJlbiAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbXV0YXRlKHBjX3JlYWNoZWQgPSBiZW5lZmljaWFyaWVzIC8gdGFyZ2V0XzIwMjEgKiAxMDApICU+JSANCiAgcmVwbGFjZShpcy5uYSguKSwgMCkgJT4lIGFycmFuZ2UoZGVzYyhwY19yZWFjaGVkKSkNCg0KYGBgDQoNCk9mIHRoZXNlIDU1IHRvd25zaGlwcywgYHIgbnJvdyhmaWx0ZXIodHNfdGFyZ2V0X3JlYWNoZWQsIHBjX3JlYWNoZWQgPiAxMjApKWAgdG93bnNoaXBzIHJlYWNoZWQgbW9yZSB0aGFuIDEyMCUgb2YgdGhlaXIgdGFyZ2V0LCBgciBucm93KGZpbHRlcih0c190YXJnZXRfcmVhY2hlZCwgcGNfcmVhY2hlZCA+IDEwMCAmIHBjX3JlYWNoZWQgPD0gMTIwKSlgIHJlYWNoZWQgYmV0d2VlbiAxMDAlIGFuZCAxMTklIG9mIHRoZWlyIHRhcmdldDsgYHIgbnJvdyhmaWx0ZXIodHNfdGFyZ2V0X3JlYWNoZWQsIHBjX3JlYWNoZWQgPiA4MCAmIHBjX3JlYWNoZWQgPD0gMTAwKSlgIHRvd25zaGlwcyByZWFjaGVkIGJldHdlZW4gODAlIGFuZCAxMDAlIG9mIHRoZWlyIHRhcmdldDsgYW5kIGByIG5yb3coZmlsdGVyKHRzX3RhcmdldF9yZWFjaGVkLCBwY19yZWFjaGVkIDw9IDgwICYgcGNfcmVhY2hlZCAhPSAwKSlgIHRvd25zaGlwcyByZWFjaGVkIGxlc3MgdGhhbiA4MCUgb2YgdGhlaXIgdGFyZ2V0Lg0KDQo8YnI+DQoNCmBgYHtyIGhpc3RvZ3JhbS1iZW5lZmljaWFyaWVzLWhycC10YXJnZXQtcmVhY2hlZH0NCg0KdHNfdGFyZ2V0X3JlYWNoZWQgJT4lIA0KICBtdXRhdGUocGNfcmVhY2hlZCA9IGlmZWxzZShwY19yZWFjaGVkID4gMjAwLCAyMDAsIHBjX3JlYWNoZWQpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBjX3JlYWNoZWQpKSArIA0KICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjApICsgDQogICBnZW9tX3JlY3QoYWVzKHhtaW4gPSA4MCwgeG1heCA9IDEyMCwgeW1pbiA9IC0wLjAxNSwgeW1heCA9IDExLjAxNSksDQogICAgICAgICAgICBmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gImdvbGRlbnJvZCIsIHNpemUgPSAwLjUpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyMDAsIGJ5ID0gMjApKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAsIGJ5ID0gMikpICsgDQogIGxhYnMoeCA9ICIlIG9mIDIwMjEgSFJQL0lFUlAgdGFyZ2V0IHJlYWNoZWQiLCANCiAgICAgICB5ID0gIk51bWJlciBvZiB0b3duc2hpcHMiLA0KICAgICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiB0b3duc2hpcHMgYnkgcGVyY2VudGFnZSBvZiAyMDIxIEhSUC9JRVJQIHRhcmdldCByZWFjaGVkIiwgDQogICAgICAgc3VidGl0bGUgPSAiVmFsdWVzIGFib3ZlIDIwMCUgaGF2ZSBiZWVuIGx1bXBlZCB0b2dldGhlciBhdCAyMDAlO1xub25seSB0aGUgNTUgdG93bnNoaXBzIHdpdGggc3BlY2lmaWMgSFJQL0lFUlAgdGFyZ2V0cyBhcmUgcmVmbGVjdGVkIGluIHRoaXMgcGxvdCIpDQpgYGANCg0KPGJyPg0KDQpUaGUgaGlzdG9ncmFtIGFib3ZlIGdyb3VwcyB0b3duc2hpcHMgYmFzZWQgb24gdGhlIHBlcmNlbnQgb2YgdGhlaXIgdGFyZ2V0IHJlYWNoZWQsIHdpdGggdGhlIHBlcmNlbnQgcmVhY2hlZCBvbiB0aGUgeC1heGlzIGFuZCB0aGUgbnVtYmVyIG9mIHRvd25zaGlwcyBvbiB0aGUgeS1heGlzLiBGcm9tIGEgcHJvZ3JhbW1lIG1hbmFnZW1lbnQgcGVyc3BlY3RpdmUsIGl0IHdvdWxkIGJlIGRlc2lyYWJsZSB0byBzZWUgdGhlIG1ham9yaXR5IG9mIHRvd25zaGlwcyB3aXRoaW4gdGhlIHllbGxvdyBib3ggKGJldHdlZW4gODAlIGFuZCAxMjAlIG9mIHRoZSB0YXJnZXQgcmVhY2hlZCksIHdoaWNoIHdvdWxkIGluZGljYXRlIHRoZSBqdWRpY2lvdXMgZGVwbG95bWVudCBvZiByZXNvdXJjZXMuIEhvd2V2ZXIsIHdlIHNlZSB0aGF0IGJvdGggb3ZlcnJlYWNoIGFuZCB1bmRlci1yZWFjaGluZyBhcmUgdmVyeSBjb21tb24sIHdpdGggdGhlIGxhcmdlc3QgbnVtYmVycyBvZiB0b3duc2hpcHMgY2x1c3RlcmVkIGFyb3VuZCAwJSBhbmQgMjAwJSBvciBtb3JlIG9mIHRoZSB0YXJnZXQgcmVhY2hlZC4gDQoNCjxicj4NCg0KSW4gdGVybXMgb2Ygc3BlY2lmaWMgbG9jYXRpb25zLG9uIGF2ZXJhZ2UsIHBhcnRuZXJzIHdvcmtlZCBpbiAxMiBsb2NhdGlvbnMgcGVyIHRvd25zaGlwLiBIb3dldmVyLCBpbiB0b3duc2hpcHMgc3VjaCBhcyBTaXR0d2UsIGF0IHRoZSBleHRyZW1lIHJpZ2h0IG9mIHRoZSBwbG90IGJlbG93LCBwYXJ0bmVycyB3b3JrZWQgaW4gYSB0b3RhbCBvZiA4NSBjYW1wcyBhbmQgNDMgdmlsbGFnZXMsIHRvd25zIG9yIHdhcmRzLiBIb3dldmVyLCB0aGlzIHBhdHRlcm4gZG9lcyBub3QgaG9sZCBmb3IgQnV0aGlkYXVuZyBvciBNYXVuZ2Rhdywgd2hlcmUgcGFydG5lcnMgd29ya2VkIGluIDcgY2FtcHMgYW5kIDg4IHZpbGxhZ2VzL3dhcmRzL3Rvd25zIGFuZCBpbiA3IGNhbXBzIGFuZCA4NSB2aWxsYWdlcy90b3ducy93YXJkcyByZXNwZWN0aXZlbHkuIFRoaXMgd2lsbCBiZSBleHBsb3JlZCBmdXJ0aGVyIGluIHRoZSBuZXh0IHNlY3Rpb24uIA0KDQo8YnI+DQoNCmBgYHtyIGhpc3RvZ3JhbS10b3duc2hpcHMtbG9jYXRpb25zfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUsIHRvd25zaGlwKSAlPiUgDQogIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBuX2Rpc3RpbmN0KGxvY2F0aW9uKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MobG9jYXRpb25zKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGxvY2F0aW9ucykpICsgDQogIGdlb21faGlzdG9ncmFtKCkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEyMCwgYnkgPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAzMCwgYnkgPSA1KSkgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGxvY2F0aW9ucyIsIA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIHRvd25zaGlwcyIsDQogICAgICAgdGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIHRvd25zaGlwcyBieSBudW1iZXIgb2YgbG9jYXRpb25zIGluIGVhY2ggdG93bnNoaXAiLA0KICAgICAgIHN1YnRpdGxlID0gIkFsbCB0b3duc2hpcHMgKHJlZ2FyZGxlc3Mgb2YgSFJQIHN0YXR1cykgaGF2ZSBiZWVuIGluY2x1ZGVkIikNCg0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDEuNCBMb2NhdGlvbnMNCg0KUGFydG5lcnMgaGF2ZSByZXNwb25kZWQgaW4gYSB0b3RhbCBvZiBgciBiZW4gJT4lIHNlbGVjdChsb2NhdGlvbikgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWAgbG9jYXRpb25zIGFjcm9zcyB0aGUgY291bnRyeSwgd2l0aCB0aGUgdmFzdCBtYWpvcml0eSBvZiBsb2NhdGlvbnMgb25seSBoYXZpbmcgb25seSBvbmUgcGFydG5lciBvcGVyYXRpbmcgaW4gdGhlbTsgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRuZXJzIGluIGFueSBsb2NhdGlvbiBpcyA0LiBPZiB0aGUgYHIgZnNjICU+JSBucm93KClgIHJvd3MgcmVwb3J0ZWQgaW4gdGhlIDVXcywgb25seSBgciBzdW0oaXMubmEoZnNjJGxvY2F0aW9uKSlgIGRpZCBub3QgcmVwb3J0IGEgc3BlY2lmaWMgbG9jYXRpb24uDQoNCkxvY2F0aW9ucyBhcmUgY2xhc3NpZmllZCBpbnRvIHRocmVlIGdyb3VwcyAtLSBjYW1wcywgaW5kdXN0cmlhbCB6b25lcyBhbmQgdmlsbGFnZXMvdG93bnMvd2FyZHM6DQoNCmBgYHtyIHRhYmxlLWxvY2F0aW9uc30NCg0KYmVuICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbl90eXBlKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbl90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBuX2Rpc3RpbmN0KGxvY2F0aW9uKSwNCiAgICAgICAgICAgIHRvd25zaGlwcyA9IG5fZGlzdGluY3QodG93bnNoaXApLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUocGNfb2ZfYmVuID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgYXZnX2Jlbl9wZXJfbG9jID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIGxvY2F0aW9ucywgZGlnaXRzID0gMCkpICU+JQ0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIGxvY2F0aW9uIHR5cGVzIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiMzgxLDk3MCBiZW5lZmljaWFyaWVzIHdlcmUgcmVwb3J0ZWQgaW4gcm93cyB3aXRob3V0IHNwZWNpZmljIGxvY2F0aW9ucyIsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiAgIyBwYW5kZXIoY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIGxvY2F0aW9uIHR5cGVzIikNCmBgYA0KDQo8YnI+DQoNClRoZSB2YXN0IG1ham9yaXR5IG9mIGxvY2F0aW9ucyBhcmUgc2VydmVkIGJ5IG9ubHkgb25lIHBhcnRuZXIuIEJlbG93IGFyZSBhIHNlcmllcyBvZiBoaXN0b2dyYW1zIHNob3dpbmcgdGhlIHZhcmlhdGlvbiBpbiB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYnkgbG9jYXRpb24sIHNwbGl0IGJ5IG51bWJlciBvZiBwYXJ0bmVycyBpbiBlYWNoIGxvY2F0aW9uLiBMb2NhdGlvbnMgd2l0aCBvbmUgcGFydG5lciBwcmVzZW50IGhhdmUgYSBsYXJnZSBwZWFrIGFyb3VuZCAxMDAgYmVuZWZpY2lhcmllcyBwZXIgbG9jYXRpb25zOyBhbmQgYSBzbGlnaHQgbWFqb3JpdHkgb2YgbG9jYXRpb25zIHdpdGggdHdvIHBhcnRuZXJzIGhhdmUgbW9yZSB0aGFuIDEsMDAwIGJlbmVmaWNpYXJpZXMuDQoNCmBgYHtyIGhpc3RvZ3JhbS1sb2NhdGlvbnMtYnktcGFydG5lcn0NCg0KYmVuICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24sIHRvd25zaGlwKSAlPiUgIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBhcnJhbmdlKGRlc2MocGFydG5lcnMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMC4xKSArDQogIHNjYWxlX3hfbG9nMTAoKSArDQogIGZhY2V0X3dyYXAofiBwYXJ0bmVycykgKw0KICBsYWJzKHkgPSAibnVtYmVyIG9mIGxvY2F0aW9ucyIsDQogICAgICAgeCA9ICJiZW5lZmljaWFyaWVzIHBlciBsb2NhdGlvbiIsIA0KICAgICAgIHRpdGxlID0gIkhpc3RvZ3JhbXMgb2YgYmVuZWZpY2lhcmllcyBieSBsb2NhdGlvbiIsDQogICAgICAgc3VidGl0bGUgPSAiRmFjZXRlZCBieSBudW1iZXIgb2YgcGFydG5lcnMgcGVyIGxvY2F0aW9uIikNCg0KYGBgDQoNCjxicj4NCg0KSW4gZ2VuZXJhbCwgdGhlIG1vcmUgcGFydG5lcnMgb3BlcmF0aW5nIGluIGEgZ2l2ZW4gbG9jYXRpb24sIHRoZSBoaWdoZXIgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXM7IGhvd2V2ZXIsIGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZXNlIG11bHRpLXBhcnRuZXIgbG9jYXRpb25zIGFyZSBjb21wYXJhdGl2ZWx5IHJhcmUuIFRoZSBsb2NhdGlvbiB3aXRoIGZvdXIgcGFydG5lcnMgaXMgTmFtIEhsYWluZyBpbiBCaGFtbywgS2FjaGluOyBpdCBpcyBzdXNwZWN0ZWQgdGhhdCB0aGUgaGlnaCBudW1iZXIgb2YgcGFydG5lcnMgaXMgZHVlIHRvIGJlbmVmaWNpYXJpZXMgZnJvbSB0aGlzIHZpbGxhZ2UgcGFydGljaXBhdGluZyBpbiBhIHJhbmdlIG9mIGFjdGl2aXRpZXMgYW5kIHRyYWluaW5ncyBoZWxkIGluIHRoZSB0b3duc2hpcCBzZWF0Lg0KDQpgYGB7ciB0YWJsZS1sb2NhdGlvbnMtcGFydG5lcnN9DQpiZW4gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGxvY2F0aW9uKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgdG93bnNoaXApICU+JSAgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIG51bWJlcl9vZl9wYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBncm91cF9ieShudW1iZXJfb2ZfcGFydG5lcnMpICU+JSANCiAgc3VtbWFyaXNlKGxvY2F0aW9ucyA9IHN1bShuX2Rpc3RpbmN0KGxvY2F0aW9uKSksDQogICAgICAgICAgICBhdmdfYmVuZWZpY2lhcmllcyA9IG1lZGlhbihiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIG11dGF0ZShudW1iZXJfb2ZfcGFydG5lcnMgPSByZWNvZGUobnVtYmVyX29mX3BhcnRuZXJzLCBgMWAgPSAib25lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGAyYCA9ICJ0d28iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYDNgID0gInRocmVlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGA0YCA9ICJmb3VyIikpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJBdmVyYWdlIGJlbmVmaWNpYXJpZXMgYnkgbG9jYXRpb25zIHdpdGggb25lLCB0d28sIHRocmVlIGFuZCBmb3VyIHBhcnRuZXJzIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikNCiAjIHBhbmRlcihjYXB0aW9uID0gIkF2ZXJhZ2UgYmVuZWZpY2lhcmllcyBieSBsb2NhdGlvbnMgd2l0aCBvbmUsIHR3bywgdGhyZWUgYW5kIGZvdXIgcGFydG5lcnMiKQ0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDIuIEFjdGl2aXRpZXMgYW5kIG1vZGFsaXRpZXMNCg0KIyMjIDIuMSBNb250aGx5IHByb2dyZXNzIGJ5IGFjdGl2aXR5DQoNCmBgYHtyIGxpbmUtcGxvdC1mYWNldC1hY3Rpdml0eX0NCmJlbiAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5KSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY3VtX2JlbiwgY29sb3VyID0gYWN0aXZpdHkpKSArDQogIGdlb21fbGluZShzaXplID0gMC43KSArDQogIGdlb21fdmxpbmUoY29sb3VyID0gImdyZXk1MCIsIGx0eSA9IDIsIHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMjEtMDYtMDEiKSkpICsNCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGZhY2V0X3dyYXAofiBhY3Rpdml0eSwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkpICsgIyBzZWUgaWYgdGhpcyB3b3JrcyB3aGVuIHlvdSBrbml0LCB0aGVuIGRvIGl0IGZvciB0aGUgb3RoZXIgcGxvdHMgDQogIGxhYnMoeCA9ICJNb250aCIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBieSBhY3Rpdml0eSwgMjAyMSIsDQogICAgICAgc3VidGl0bGUgPSAiRmlndXJlcyBhcmUgaW4gY3VtdWxhdGl2ZSB1bmlxdWUgYmVuZWZpY2lhcmllcyByZWFjaGVkIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKQ0KDQpgYGANCg0KUGFydG5lcnMgcmVwb3J0ZWQgdGhlaXIgYWNoaWV2ZW1lbnRzIGFjcm9zcyB0aGUgZWlnaHQgNVcgYWN0aXZpdGllcy4gVGhlIG1ham9yaXR5IG9mIHRoZSBjYXNlbG9hZCBmb3IgbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyB3YXMgZXN0YWJsaXNoZWQgcHJpb3IgdG8gMjAyMSAod2l0aCB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgb25seSBpbmNyZWFzaW5nIHZlcnkgaW5jcmVtZW50YWxseSBhY3Jvc3MgdGhlIGNvdXJzZSBvZiB0aGUgeWVhcikgLS0gdGhpcyBoaWdobGlnaHRzIHRoYXQgbWFueSBvZiB0aGUgcHJvamVjdHMgY29udHJpYnV0aW5nIHRvIHRoaXMgYWN0aXZpdHkgcmVwZWF0IHllYXIgYWZ0ZXIgeWVhciBhbmQgaGFkIGJlZW4gb25nb2luZyBwcmlvciB0byB0aGUgSFJQOyB0aGlzIHBhdHRlcm4gaXMgYWxzbyBhcHBhcmVudCBpbiB0aGUgcHJvdmlzaW9uIG9mIHRlY2huaWNhbCB0cmFpbmluZy4NCg0KT25lIG9mIHRoZSBkaWZmaWN1bHRpZXMgb2YgaW50ZXJwcmV0aW5nIHRoZXNlIGRhdGEgaXMgdGhhdCBpdCBpcyBub3QgYWx3YXlzIGFwcGFyZW50IHdoZXJlIHRoZSBwYXR0ZXJucyBvYnNlcnZlZCBhcmUgcmVmbGVjdGl2ZSBvciBjaGFuZ2VzIGluIHRoZSBmaWVsZCAoc3VjaCBhcyBjaGFuZ2VzIGluIGFjY2VzcywgZnVuZGluZyBvciBzdGFmZmluZykgb3IgaWYgdGhleSBhcmUgaW5zdGVhZCBkdWUgdG8gcGFydG5lcnMnIHJlcG9ydGluZyBiZWhhdmlvdXJzLiBGb3IgaW5zdGFuY2UsIGZvciB0aGUgbGFyZ2UganVtcCBpbiB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgZm9yIGZpc2hlcnkga2l0cyBhbmQgZm9vZCBiYXNrZXRzIGFmdGVyIEp1bmUgMjAyMSAobWFya2VkIGJ5IHRoZSBkb3R0ZWQgZ3JleSBsaW5lKSwgdGhpcyBjb2luY2lkZXMgd2l0aCB0aGUgYXBwcm92YWwgb2YgdGhlIEhSUCBhZGRlbmR1bS9JRVJQLiBIb3dldmVyLCBzb21lIG9mIHRoZSBvdGhlciBjaGFuZ2VzIGFyZSBsZXNzIGNsZWFyIGFuZCB3aWxsIHJlcXVpcmUgY2FyZWZ1bCBleHBsb3JhdGlvbiB3aXRoIHBhcnRuZXJzLg0KDQo8YnI+DQoNCiMjIyAyLjIgRGVsaXZlcnkgbW9kYWxpbHRpZXMNCg0KQ2FzaCBhbmQgaW4ta2luZCBkaXN0cmlidXRpb25zIHdlcmUgZWFjaCB0aGUgbWFpbiBkZWxpdmVyeSBtb2RhbGl0eSBpbiB0aHJlZSBhY3Rpdml0aWVzLCB3aXRoIHRoZSBwcm92aXNpb24gb2Ygc2VydmljZXMgYW5kIHN1cHBvcnQgYmVpbmcgcHJlZG9taW5hbnQgaW4gdHdvLiBUaGUgaW4ta2luZCBtb2RhbGl0eSBoYXMgdGhlIGhpZ2hlc3QgcmVhY2gsIGdpdmVuIHRoZSBlc3BlY2lhbGx5IGxhcmdlIGJlbmVmaWNpYXJ5IG51bWJlcnMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgcHJvdmlzaW9uIG9mIG1vbnRobHkgZm9vZCBiYXNrZXRzLiBTZXZlcmFsIG1pc2NsYXNzaWZpY2F0aW9ucyAtLSBzbWFsbCBwb3J0aW9ucyBvZiBtb250aGx5IGNhc2ggdHJhbnNmZXJzIGhhdmUgYmVlbiBjb2RlZCBhcyAiaW4ta2luZCIgYW5kIHRoZXJlIGFyZSBpbi1raW5kIGZvb2QgYmFza2V0cyBjb2RlZCBhcyAiY2FzaCIgYW5kICJoeWJyaWQiLiBJdCBtaWdodCBhbHNvIGJlIHdvcnRoIG1vcmUgY2xlYXJseSBkZWxpbmVhdGluZyBiZXR3ZWVuICJzdXBwb3J0IGZvciBpbmNvbWUtZ2VuZXJhdGluZyBhY3Rpdml0aWVzIiBhbmQgdGhlICJwcm92aXNpb24gb2YgdGVjaG5pY2FsIHRyYWluaW5nIiBhcyBzZXJ2aWNlIGRlbGl2ZXJ5IGFuZCBzdXBwb3J0IGFyZSBoZWF2aWx5IHByZXNlbnQgaW4gYm90aC4NCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LWZhY2V0LWFjdGl2aXR5LW1vZGFsaXR5fQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSANCiAgZ3JvdXBfYnkoZGVsaXZlcnlfbW9kYWxpdHksIGFjdGl2aXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gcmVjb2RlKGRlbGl2ZXJ5X21vZGFsaXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIeWJyaWQgKEluLWtpbmQgJiBDYXNoKSIgPSAiSHlicmlkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXJ2aWNlIGRlbGl2ZXJ5L3N1cHBvcnQiID0gIlNlcnZpY2VzL3N1cHBvcnQiKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkZWxpdmVyeV9tb2RhbGl0eSwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICB0aXRsZSA9ICJEZWxpdmVyeSBtb2RhbGl0eSBieSBhY3Rpdml0eSwgMjAyMSIsDQogICAgICAgc3VidGl0bGUgPSAiRmlndXJlcyBhcmUgaW4gYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDAsIGhqdXN0ID0gMC41LCB2anVzdCA9IDAuNSkpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikNCg0KYGBgDQoNCg0KDQo8YnI+DQoNCmByIHJvdW5kKGZpbHRlcihmc2MsIGRlbGl2ZXJ5X21vZGFsaXR5ID09ICJJbi1raW5kIikgJT4lIHtzdW0oLiRiZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJGJlbmVmaWNpYXJpZXMpICogMTAwKWAlIG9mIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIHJlY2VpdmVkIHN1cHBvcnQgdGhyb3VnaCB0aGUgaW4ta2luZCBkZWxpdmVyeSBtb2RhbGl0eTsgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgYXJlIHVzZWQgaGVyZSBhcyB0aGVyZSB3ZXJlIHNldmVyYWwgaW5zdGFuY2VzIG9mIG1vZGFsaXRpZXMgY2hhbmdpbmcgcGFydHdheSB0aHJvdWdoIGFuIGludGVydmVudGlvbjogZm9yIHJlZmVyZW5jZSwgYHIgcm91bmQoZmlsdGVyKGZzYywgZGVsaXZlcnlfbW9kYWxpdHkgPT0gIkluLWtpbmQiKSAlPiUge3N1bSguJHVfYmVuLCBuYS5ybSA9IFRSVUUpfSAvIHN1bShmc2MkdV9iZW4sIG5hLnJtID0gVFJVRSkgKiAxMDApYCUgb2YgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgaW5pdGlhbGx5IHdpdGggaW4ta2luZCBpbnRlcnZlbnRpb25zLCBtZWFuaW5nIHRoYXQgdGhlcmUgd2FzIGEgdGVuZGVuY3kgdG8gZGl2ZXJzaWZ5IGF3YXkgZnJvbSBpbi1raW5kIHN1cHBvcnQgb3ZlciAyMDIxLiBgciByb3VuZChmaWx0ZXIoZnNjLCBkZWxpdmVyeV9tb2RhbGl0eSA9PSAiQ2FzaCIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9IC8gc3VtKGZzYyRiZW5lZmljaWFyaWVzKSAqIDEwMClgJSBvZiBiZW5lZmljaWFyeSBmcmVxdWVuY2llcyB3ZXJlIHJlYWNoZWQgYnkgY2FzaCB0cmFuc2ZlcnMuDQoNCjxicj4NCg0KYGBge3IgdGFibGUtbW9kYWxpdHktZnJlcXVlbmN5fQ0KDQojIGNoYW5nZWQgdG8gYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgaW5zdGVhZCBvZiB1bmlxdWUgYmVuZWZpY2lhcmllcyANCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgDQogIGdyb3VwX2J5KGRlbGl2ZXJ5X21vZGFsaXR5LCBmcmVxdWVuY3kpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBmcmVxdWVuY3ksIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBhZG9ybl90b3RhbHMoImNvbCIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoYCVUb3RhbGAgPSByb3VuZChUb3RhbCAvIHN1bShUb3RhbCkgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhUb3RhbCkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciLCBuYS5ybSA9IFRSVUUpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJCZW5lZmljaWFyeSBmcmVxdWVuY2llcyBieSBkZWxpdmVyeSBtb2RhbGl0aWVzIGFuZCBmcmVxdWVuY3kgb2YgZGlzdHJpYnV0aW9uIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiQmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVwb3J0ZWQgd2l0aG91dCBhIGRlbGl2ZXJ5IG1vZGFsaXR5IHNwZWNpZmllZCBoYXZlIGJlZW4gZXhjbHVkZWQiLCANCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KICAjIHBhbmRlcihjYXB0aW9uID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIGJ5IGRlbGl2ZXJ5IG1vZGFsaXRpZXMgYW5kIGZyZXF1ZW5jeSBvZiBkaXN0cmlidXRpb24iKQ0KDQpgYGANCg0KPGJyPg0KDQpSZWdhcmRpbmcgdGhlIHRhYmxlIGFib3ZlLCB0aGVyZSBpcyBhIHN0cm9uZyBhcmd1bWVudCB0byByZW1vdmUgdGhlIG9wdGlvbiAib3RoZXIiIGZyb20gdGhlIDVXIGNvbHVtbiBgZnJlcXVlbmN5YCAocmVmZXJyaW5nIHRvIGZyZXF1ZW5jeSBvZiB0cmFuc2Zlci9kZWxpdmVyeSkgLS0gd2hhdCBleGFjdGx5IGl0IGNvbm5vdGVzIGlzIHVuY2xlYXIsIGFzIHBhcnRuZXJzIG1pZ2h0IGVsZWN0IHRoaXMgb3B0aW9uIGZvciBhY3Rpdml0aWVzIHRoYXQgb2NjdXIgYm90aCBtb3JlIGFuZCBsZXNzIGZyZXF1ZW50bHkgdGhhbiBldmVyeSBtb250aDsgdGhlcmUgaXMgYWxzbyB0aGUgcG9zc2liaWxpdHkgdGhhdCBwYXJ0bmVycyBhcmUganVzdCBlbGVjdGluZyAib3RoZXIiIGluc3RlYWQgb2YgbGVhdmluZyB0aGUgY29sdW1uIGJsYW5rLiBJdCBpcyBwb3NzaWJsZSB0byBiYWNrZmlsbCBzb21lIG9mIHRoZSAib3RoZXIiIHZhbHVlcyBmcm9tIHRoZSBgYmVuZWZpY2lhcnlfcmVjdXJyZW5jeWAgY29sdW1uLiBUaGlzIHdpbGwgYmUgZXhwbG9yZWQgZnVydGhlciBpbiB0aGUgY2hhcHRlciBvbiBiZW5lZmljaWFyaWVzLiANCg0KVGhlcmUgaXMgYWxzbyBqdXN0aWZpY2F0aW9uIHRvIGRyb3AgdGhlICJGaXJzdCIgY2F0ZWdvcnkgYXMgaXQgZG9lcyBub3QgcmVhbGx5IGhhdmUgbXVjaCByZWxhdGlvbiB0byB0aGUgIk1vbnRobHkiIGNhdGVnb3J5LCBpLmUuIGFuIGluY3JlYXNlIGluIGJlbmVmaWNpYXJpZXMgcmVwb3J0ZWQgYXMgIkZpcnN0IiBkbyBub3QgY29ycmVzcG9uZCB0byBhbiBpbmNyZWFzZSBpbiAiTW9udGhseSIgYmVuZWZpY2lhcmllcyBpbiB0aGUgZm9sbG93aW5nIG1vbnRocywgbWVhbmluZyB0aGF0IHRoZXNlIGJlbmVmaWNpYXJpZXMgc2hvdWxkIGZhbGwgdW5kZXIgdGhlICJPbmUtb2ZmIiBjYXRlZ29yeS4gDQoNClRoZSBjb2x1bW4gYG1vbnRoc19vZl9mb29kX3JhdGlvbl9kaXN0cmlidXRlZGAsIGJ1dCB0aGlzIGNvbHVtbiBpcyBsYXJnZWx5IGJsYW5rIGFuZCBub24tTkEgdmFsdWVzIGhhdmUgYWxzbyBub3QgYmVlbiBmaWxsZWQgd2VsbCwgbWVhbmluZyB0aGF0IGEga2V5IHBpZWNlIG9mIGRhdGEgLS0gYWN0aXZpdHkgZHVyYXRpb25zIC0tIGhhcyBub3QgYmVlbiBlZmZlY3RpdmVseSBjYXB0dXJlZC4gSG93ZXZlciwgYSB3b3JrYXJvdW5kIC0tIHJlcXVpcmluZyBjb25zaWRlcmFibGUgZWZmb3J0IC0tIHlpZWxkcyB1cyB0aGUgdGFibGUgYmVsb3csIHNob3dpbmcgdGhlIGF2ZXJhZ2UgZHVyYXRpb24gKGluIG1vbnRocykgb2YgdGhlIHZhcmlvdXMgYWN0aXZpdGllcyBjbGFzc2lmaWVkIGFzICJNb250aGx5IiB1bmRlciB0aGUgYGZyZXF1ZW5jeWAgY29sdW1uOg0KDQoNCmBgYHtyIHRhYmxlLWF2Zy1kdXJhdGlvbi1hY3Rpdml0aWVzfQ0KZnNjICU+JSAgDQogIGZpbHRlcihmcmVxdWVuY3kgPT0gIk1vbnRobHkiKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5LCB0b3duc2hpcCwgbG9jYXRpb24pICU+JQ0KICBzdW1tYXJpc2UocmVjdXJyZW5jZXMgPSBuX2Rpc3RpbmN0KGRhdGUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgZ3JvdXBfYnkoYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19kdXJhdGlvbl9tb250aHMgPSByb3VuZChtZWFuKHJlY3VycmVuY2VzKSwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKGF2Z19kdXJhdGlvbl9tb250aHMpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQXZlcmFnZSBkdXJhdGlvbiAoaW4gbW9udGhzKSBvZiBtb250aGx5IGFjdGl2aXRpZXMiKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoID0gRkFMU0UsIHBvc2l0aW9uID0gImxlZnQiKQ0KICAjIHBhbmRlcihjYXB0aW9uID0gIkF2ZXJhZ2UgZHVyYXRpb24gKGluIG1vbnRocykgb2YgbW9udGhseSBhY3Rpdml0aWVzIikNCiAgDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDIuMyBNb25ldGFyeSB2YWx1ZXMgb2YgaW50ZXJ2ZW50aW9uIHBhY2thZ2VzIHBlciBob3VzZWhvbGQNCg0KPGJyPg0KDQpgYGB7ciBwbG90LXVzZC1oaGQtYmlufQ0KZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiICYgIWlzLm5hKHVzZF9oaGRfYmluKSkgJT4lDQogIGZpbHRlcihkZWxpdmVyeV9tb2RhbGl0eSAlaW4lIGMoIkNhc2giLCAiSHlicmlkIChJbi1raW5kICYgQ2FzaCkiLCAiVm91Y2hlciIpKSAlPiUNCiAgZ3JvdXBfYnkodXNkX2hoZF9iaW4pICU+JSAgDQogIHN1bW1hcmlzZShob3VzZWhvbGRzID0gc3VtKGhvdXNlaG9sZHMpKSAlPiUNCiAgbXV0YXRlKGAlX29mX2hvdXNlaG9sZHNgID0gcm91bmQoaG91c2Vob2xkcyAvIHN1bShob3VzZWhvbGRzKSogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB1c2RfaGhkX2JpbiwgeSA9IGhvdXNlaG9sZHMsIGZpbGwgPSB1c2RfaGhkX2JpbikpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBgJV9vZl9ob3VzZWhvbGRzYCksIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJHcmVlbnMiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gc2VxKDAsIDI1MDAwLCBieSA9IDUwMDApKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBsYWJzKHggPSAiVVNEIHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCBwZXIgbW9udGgiLA0KICAgICAgIHkgPSAiTnVtYmVyIG9mIGhvdXNlaG9sZHMiLA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBob3VzZWhvbGRzIGJ5IHZhbHVlIG9mIGNhc2ggdHJhbnNmZXIgcGVyIGhvdXNlaG9sZCIsDQogICAgICAgc3VidGl0bGUgPSAiRmlndXJlcyBhdCB0aGUgdG9wIG9mIGVhY2ggYmFyIHNob3cgcGVyY2VudGFnZSBvZiBob3VzZWhvbGRzXG5Pbmx5IGhvdXNlaG9sZHMgcmVhY2hlZCB0aHJvdWdoIHRoZSBjYXNoLCBoeWJyaWQgb3Igdm91Y2hlciBtb2RhbGl0aWVzIGFyZSBpbmNsdWRlZCIpDQpgYGANCg0KPGJyPg0KDQoNClRoZSBtb3N0IGNvbW1vbiB0cmFuc2ZlciB2YWx1ZXMgLS0gaW4gdGVybXMgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIC0tIGFyZSBiZXR3ZWVuIFVTRCA2MCBhbmQgODAsIGl0IHNob3VsZCBhbHNvIGJlIG5vdGVkIHRoYXQgYSBub3QgaW5zaWduaWZpY2FudCBudW1iZXIgb2YgaG91c2Vob2xkcyAoYWJvdXQgOCUpIHdlcmUgcmVhY2hlZCBieSBjYXNoIHRyYW5zZmVyIGludGVydmVudGlvbnMgdmFsdWVkIGF0IFVTRCAxMDAgcGVyIGhvdXNlaG9sZCBvciBtb3JlICh0aG91Z2ggdG8gd2hhdCBleHRlbnQgdGhlIG1vcmUgZXh0cmVtZSB2YWx1ZXMgYXJlIGNvcnJlY3QgcmVtYWlucyB0byBiZSBpbnZlc3RpZ2F0ZWQpLiBJdCBzaG91bGQgYWxzbyBiZSBub3RlZCB0aGF0IDM1JSBvZiB0aGUgaG91c2Vob2xkcyB3aG8gcmVjZWl2ZWQgdHJhbnNmZXJzIHZhbHVlcyBhdCBiZWxvdyBVU0QgNDAvbW9udGggd2VyZSB0aGUgYmVuZWZpY2lhcmllcyBvZiB0aGUgImh5YnJpZCIgZGVsaXZlcnkgbW9kYWxpdHksIGFuZCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgaW4ta2luZCBnb29kcyB0aGV5IHJlY2VpdmVkIG1pZ2h0IG5vdCBoYXZlIGJlZW4gaW5jbHVkZWQgaW4gdGhpcyBzdW0uIFBsZWFzZSBub3RlIHRoYXQgdGhlc2UgbW9uZXRhcnkgdmFsdWVzIHdlcmUgY2FsY3VsYXRlZCBvbmx5IGZyb20gcm93cyB3aXRoIHVuaXF1ZSBiZW5lZmljaWFyaWVzIGFuZCB0aGF0IHRoZXNlIGFyZSBub3QgdGhlIGN1bXVsYXRpdmUgc3VtcyBwZXIgaG91c2Vob2xkLg0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLXVzZC1oaGQtYmluLWZyZXF1ZW5jeX0NCmNhc2hfZGVsaXZlcnlfbWVjaGFuaXNtIDwtIGZzYyAlPiUgIA0KICBmaWx0ZXIoIWlzLm5hKHVzZF9oaGRfYmluKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiICYgIWlzLm5hKGNhc2hfZGVsaXZlcnlfbWVjaGFuaXNtKSApICU+JSANCiAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ2FzaCIsICJIeWJyaWQgKEluLWtpbmQgJiBDYXNoKSIsICJWb3VjaGVyIikpICU+JSANCiAgbXV0YXRlKGhvdXNlaG9sZHMgPSByb3VuZChob3VzZWhvbGRzKSkgJT4lIA0KICBjb3VudCh1c2RfaGhkX2JpbixjYXNoX2RlbGl2ZXJ5X21lY2hhbmlzbSwgd3QgPSBob3VzZWhvbGRzKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHVzZF9oaGRfYmluLCB2YWx1ZXNfZnJvbSA9IG4pICU+JSANCiAgYWRvcm5fdG90YWxzKCJjb2wiLCBuYS5ybSA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHRvdGFsX2hoZCA9IFRvdGFsKSAlPiUgDQogIG11dGF0ZShwY19vZl9oaGQgPSByb3VuZCh0b3RhbF9oaGQgLyBzdW0odG90YWxfaGhkKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKHRvdGFsX2hoZCkpIA0KDQpjYXNoX2RlbGl2ZXJ5X21lY2hhbmlzbSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiQ2FzaCB0cmFuc2ZlciwgaHlicmlkIGFuZCB2b3VjaGVyIHZhbHVlcyBwZXIgaG91c2Vob2xkLCBieSBjYXNoIGRlbGl2ZXJ5IG1lY2hhbmlzbSAoVVNEKSIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMihsaWdodGFibGVfb3B0aW9ucyA9ICJzdHJpcGVkIikgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIk9ubHkgaG91c2Vob2xkcyB3aGljaCB3ZXJlIHJlYWNoZWQgYnkgY2FzaCwgaHlicmlkIG9yIHZvdWNoZXIgbW9kYWxpdGllcyBhcmUgaW5jbHVkZWQiLCANCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KIyBwYW5kZXIoY2FwdGlvbiA9ICJDYXNoIHRyYW5zZmVyLCBoeWJyaWQgYW5kIHZvdWNoZXIgdmFsdWVzIHBlciBob3VzZWhvbGQgYnkgY2FzaCBkZWxpdmVyeSBtZWNoYW5pc20gKFVTRCkiKQ0KDQpgYGANCg0KPGJyPg0KDQpCeSBmYXIgdGhlIG1vc3QgY29tbW9uIGNhc2ggZGVsaXZlcnkgbWVjaGFuaXNtIHdhcyBkaXJlY3QgY2FzaCBwYXltZW50cyAtLSBgciBmaWx0ZXIoY2FzaF9kZWxpdmVyeV9tZWNoYW5pc20sIGNhc2hfZGVsaXZlcnlfbWVjaGFuaXNtID09ICJEaXJlY3QgY2FzaCBwYXltZW50IikgJT4lICBwdWxsKHBjX29mX2hoZClgJSBvZiBob3VzZWhvbGRzIHdlcmUgcmVhY2hlZCB0aHJvdWdoIHRoaXMgbWVjaGFuaXNtLiBUcmFuc2ZlcnMgbWFkZSB0aHJvdWdoIE1vbmV5IHRyYW5zZmVyIGFnZW50cyBoYWQgdGhlIGhpZ2hlc3QgYXZlcmFnZSB0cmFuc2ZlciBhbW91bnQuIA0KDQoNCg0KTmV4dCwgbGV0IHVzIHRha2UgYSBsb29rIGF0IGhvdXNlaG9sZCBwYWNrYWdlIHZhbHVlcyBieSBhY3Rpdml0eSB0eXBlOg0KDQpgYGB7ciB0YWJsZS11c2QtdmFsdWVzLWFjdGl2aXR5fQ0KZnNjICU+JSANCiAgZmlsdGVyKGRlbGl2ZXJ5X21vZGFsaXR5ICVpbiUgYygiQ2FzaCIsICJIeWJyaWQgKEluLWtpbmQgJiBDYXNoKSIsICJWb3VjaGVyIikpICU+JQ0KICBmaWx0ZXIobmV3X3ZhbHVlX2hoZCA8IDcwMCkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eSkgJT4lIA0KICBzdW1tYXJpc2UoaGhkX2ZyZXF1ZW5jaWVzID0gcm91bmQoc3VtKGhvdXNlaG9sZHMsIG5hLnJtID0gVFJVRSkpLA0KICAgICAgICAgICAgdG90YWxfdmFsdWVfdXNkID0gcm91bmQoc3VtKHRvdGFsX3ZhbHVlX3VzZCwgbmEucm0gPSBUUlVFKSkpICU+JSANCiAgbXV0YXRlKGF2Z190cmFuc2Zlcl92YWx1ZSA9IHJvdW5kKHRvdGFsX3ZhbHVlX3VzZCAvIGhoZF9mcmVxdWVuY2llcywgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKGF2Z190cmFuc2Zlcl92YWx1ZSkpICU+JSAgDQogIGthYmxlKGNhcHRpb24gPSAiQXZlcmFnZSB2YWx1ZSAoVVNEKSBvZiBob3VzZWhvbGQgcGFja2FnZSB2YWx1ZXMgcGVyIGFjdGl2aXR5IiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKGxpZ2h0YWJsZV9vcHRpb25zID0gInN0cmlwZWQiKSAlPiUgDQogIGZvb3Rub3RlKGdlbmVyYWwgPSAiT25seSBob3VzZWhvbGRzIHdoaWNoIHdlcmUgcmVhY2hlZCBieSBjYXNoLCBoeWJyaWQgb3Igdm91Y2hlciBtb2RhbGl0aWVzIGFyZSBpbmNsdWRlZCIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQojIHBhbmRlcihjYXB0aW9uID0gIkF2ZXJhZ2UgdmFsdWUgKFVTRCkgb2YgaG91c2Vob2xkIHBhY2thZ2UgdmFsdWVzIHBlciBhY3Rpdml0eSIpDQogIA0KYGBgDQoNCjxicj4NCg0KT3ZlcmFsbCwgdGhlIGhpZ2hlc3QgYXZlcmFnZSBjYXNoIHRyYW5zZmVycyB3ZXJlIGZyb20gdGhlIHByb3Zpc2lvbiBvZiBsaXZlc3RvY2sga2l0cyBhbmQgdGhlIGxvd2VzdCBhdmVyYWdlcyBmcm9tIENhc2ggZm9yIHdvcmsvZm9vZCBmb3IgYXNzZXRzIGFjdGl2aXRpZXMgKGFmdGVyIGRpc2NvdW50aW5nIGZvb2QgYmFza2V0cykuIFBsZWFzZSBhbHNvIG5vdGUgdGhhdCBmb3IgdGhlIGFib3ZlIHRhYmxlLCBhbGwgcGVyIGhvdXNlaG9sZCB2YWx1ZXMgYWJvdmUgVVNEIDcwMCBoYXZlIGJlZW4gZmlsdGVyZWQgb3V0IGFzIHRoZXkgYXJlIGxpa2VseSBlcnJvcnMuIEJ1dCB0aGUgYXZlcmFnZSBwYWNrYWdlIHZhbHVlcyBhcmUgb25seSBwYXJ0IG9mIHRoZSBwaWN0dXJlIGFuZCBzaWduaWZpY2FudCB2YXJpYXRpb24gaW4gdHJhbnNmZXIgdmFsdWVzIGV4aXN0cyB3aXRoaW4gZWFjaCBhY3Rpdml0eToNCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LWZhY2V0LXVzZC1oaGQtYmluLWFjdGl2aXR5fQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYSh1c2RfaGhkX2JpbikgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDYXNoIiwgIkh5YnJpZCAoSW4ta2luZCAmIENhc2gpIiwgIlZvdWNoZXIiKSkgJT4lDQogIGdyb3VwX2J5KGFjdGl2aXR5LCB1c2RfaGhkX2JpbikgJT4lIA0KICBzdW1tYXJpc2UoaG91c2Vob2xkcyA9IHN1bShob3VzZWhvbGRzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB1c2RfaGhkX2JpbiwgeSA9IGhvdXNlaG9sZHMsIGZpbGwgPSBhY3Rpdml0eSkpICsNCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICBsYWJzKHggPSAiIikgKw0KICBsYWJzKHRpdGxlID0gIlZhcmlhdGlvbiBpbiB0aGUgcGVyIGhvdXNlaG9sZCB2YWx1ZXMgb2YgaW50ZXJ2ZW50aW9uIHBhY2thZ2VzIGluIFVTRCIsIA0KICAgICAgIHN1YnRpdGxlID0gIkZhY2V0ZWQgYnkgYWN0aXZpdHk7IGNvbnRhaW5zIG9ubHkgZGF0YSBmcm9tIGFjdGl2aXRpZXMgdXNpbmcgY2FzaCwgaHlicmlkIG9yIHZvdWNoZXIgbW9kYWxpdGllcyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksIA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICsNCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXR5LCBzY2FsZXMgPSAiZnJlZV95IikNCg0KYGBgDQoNCjxicj4NCg0KYGBge3IgZGF0YXNldC1jYnQtYmluc30NCmNidF9iaW5zIDwtIGZzYyAlPiUgZmlsdGVyKGFjdGl2aXR5ID09ICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMiICYgIWlzLm5hKHVzZF9oaGRfYmluKSkgJT4lDQogIGNvdW50KHVzZF9oaGRfYmluLCB3dCA9IGhvdXNlaG9sZHMpICU+JSANCiAgbXV0YXRlKHBjX29mX3RvdGFsID0gcm91bmQobiAvIHN1bShuKSAqIDEwMCwgZGlnaXRzID0gMikpDQoNCmBgYA0KDQoNCkEgZnVsbCBgciBmaWx0ZXIoY2J0X2JpbnMsIHVzZF9oaGRfYmluID09ICI+PSQ2MF88JDgwIikgJT4lIHB1bGwocGNfb2ZfdG90YWwpYCBvZiBob3VzZWhvbGRzIHdobyBiZW5lZml0dGVkIGZyb20gY2FzaC1iYXNlZCB0cmFuc2ZlcnMgcmVjZWl2ZWQgcGFja2FnZXMgdmFsdWVzIGJldHdlZW4gVVNEIDYwIGFuZCBVU0QgODAsIGluZGljYXRpbmcgdGhhdCB0aGlzIGFjdGl2aXR5IC0tIGluIGFkZGl0aW9uIHRvIHRoZSBwcm92aXNpb24gb2YgY3JvcHMgYW5kIHZlZ2V0YWJsZSBraXRzIGFuZCBsaXZlc3RvY2sga2l0cywgd2hpY2ggYWxzbyBoYXZlIGNsZWFyIHBlYWtzIC0tIHdvdWxkIGJlIHJlbGF0aXZlbHkgZWFzeSB0byBzdGFuZGFyZGlzZS4gDQoNClRoaXMgc2VjdGlvbiBoYXMgdHJpZWQgdG8gd29yayBhcm91bmQgc2V2ZXJhbCBkYXRhIGVudHJ5IGVycm9ycyBpbiB0aGUgNVcgcmVwb3J0aW5nIC0tIHRoZSBwZXIgaG91c2Vob2xkIHZhbHVlcyBvZiBjYXNoIHRyYW5zZmVycyBoYXZlIGJlZW4gcmVjYWxjdWxhdGVkIHVzaW5nIHRoZSBudW1iZXIgb2YgaG91c2Vob2xkcyByZWFjaGVkIGFuZCB0aGUgdG90YWwgdmFsdWUgKGluIFVTRCkgb2YgdGhlIGNhc2ggdHJhbnNmZXJzIHByb3ZpZGVkLiBHb2luZyBmb3J3YXJkLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmV2aWV3IGFuZCBjb25maXJtIHRoZXNlIGVycm9ycyB3aXRoIHBhcnRuZXJzIGFuZCBjbGVhbiB0aGUgNVcgZGF0YXNldCBhcyBtYW55IG9mIHRoZW0gaGF2ZSByZWNvcmRlZCBjYXNoIHRyYW5zZmVyIHZhbHVlcyBvZiBhcm91bmQgVVNEIDEwLjUwIHBlciBob3VzZWhvbGQgYXMgb3Bwb3NlZCB0byBvdXIgcmVjYWxjdWxhdGVkIHZhbHVlIHdoaWNoIGF2ZXJhZ2VzIG91dCBhdCBVU0QgYHIgcm91bmQoZnNjICU+JSBmaWx0ZXIodmFsdWVfcGVyX2hvdXNlaG9sZF91c2QgPT0gMTAuNSkgJT4lIHttZWRpYW4oLiRuZXdfdmFsdWVfaGhkKX0sIGRpZ2l0cyA9IDIpYDsgaXQgaXMgc3VzcGVjdGVkIHRoYXQgdGhlIHBlciBiZW5lZmljaWFyeSB2YWx1ZSBtYXkgaGF2ZSBiZWVuIGVudGVyZWQgYXMgb3Bwb3NlZCB0byB0aGUgdmFsdWUgcGVyIGhvdXNlaG9sZC4gDQoNClRoZSBwYXJ0bmVycyB3aG8gaGF2ZSAgLS0gbGlrZWx5LCBpbiBlcnJvciAtLSByZWNvcmRlZCB0aGlzIFVTRCAxMC41MCB0cmFuc2ZlciBhcmU6IFdGUCwgUGxhbiBJbnRlcm5hdGlvbmFsLCBTYXZlIHRoZSBDaGlsZHJlbiwgTXlhbm1hciBIZWFydCBEZXZlbG9wbWVudCBPcmdhbmlzYXRpb24sIFBlb3BsZSBmb3IgUGVvcGxlLCBXb3JsZCBWaXNpb24gTXlhbm1hciBhbmQgUGVvcGxlIGluIE5lZWQuDQoNClRoZSB0YWJsZSBiZWxvdyBjb21wYXJlcyB0aGUgZGlmZmVyZW50IGJpbnMgZm9yIGNhc2gtdHJhbnNmZXIgdmFsdWVzIHRvIHRoZSBtaW5pbXVtIGV4cGVuZGl0dXJlIGJhc2tldCBmb3IgZm9vZCBlc3RhYmxpc2hlZCBieSB0aGUgQ2FzaCBXb3JraW5nIEdyb3VwIC0tIHRoZXkgaGF2ZSBzZXQgYSBmbG9vciBvZiBNTUsgMTkwLDU1NSAob3IgVVNEIDExNC41NSkgcGVyIGhvdXNlaG9sZCBwZXIgbW9udGg6DQoNCg0KYGBge3IgdGFibGUtbWViLXVzZC1oaGQtYmlufQ0KDQpmc2MgJT4lIA0KICBmaWx0ZXIodW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIgJiBhY3Rpdml0eSA9PSAiUHJvdmlkZSBtb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXJzIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKG5ld192YWx1ZV9oaGQpKSAlPiUgDQogIG11dGF0ZShwY19tZWIgPSBuZXdfdmFsdWVfaGhkIC8gMTE0LjU1KSAlPiUgDQogIGdyb3VwX2J5KHVzZF9oaGRfYmluKSAlPiUgDQogIHN1bW1hcmlzZShhdmdfcGNfb2ZfbWViID0gcm91bmQobWVhbihwY19tZWIpICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgICAgIGF2Z191c2RfbW9udGggPSByb3VuZChtZWFuKG5ld192YWx1ZV9oaGQsIG5hLnJtID0gVFJVRSksIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgICAgaG91c2Vob2xkcyA9IHJvdW5kKHN1bShob3VzZWhvbGRzKSkpICU+JSANCiAgbXV0YXRlKHBjX29mX2hoZCA9IHJvdW5kKGhvdXNlaG9sZHMgLyBzdW0oaG91c2Vob2xkcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiTW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVyIHZhbHVlcyBieSBwZXJjZW50YWdlIG9mIE1FQiByZWNlaXZlZCIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lIA0KICBjb2x1bW5fc3BlYyg1LCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSBzcGVjX2NvbG9yKGNidF9iaW5zJHBjX29mX3RvdGFsWzE6N10sIGVuZCA9IDAuOCwgZGlyZWN0aW9uID0gLTEpKSAlPiUNCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJPbmx5IGhvdXNlaG9sZHMgcmVhY2hlZCB0aHJvdWdoIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgYXJlIGluY2x1ZGVkIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KIyBwYW5kZXIoY2FwdGlvbiA9ICJNb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXIgdmFsdWVzIGJ5IHBlcmNlbnRhZ2Ugb2YgTUVCIHJlY2VpdmVkIikNCg0KYGBgDQoNCjxicj4NCg0KT3ZlcmFsbCwgYHIgcm91bmQoZmlsdGVyKGZzYywgbmV3X3ZhbHVlX2hoZCA+ICgxMTQuNTUvMikgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmIGFjdGl2aXR5ID09ICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMiKSAlPiUge3N1bSguJGJlbmVmaWNpYXJpZXMpfSAvIGZpbHRlcihmc2MsICFpcy5uYShuZXdfdmFsdWVfaGhkKSAmIHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiICYgYWN0aXZpdHkgPT0gIlByb3ZpZGUgbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyIpICU+JSB7c3VtKC4kYmVuZWZpY2lhcmllcyl9ICogMTAwLCBkaWdpdHMgPSAyKWAgb2YgYmVuZWZpY2lhcnkgaG91c2Vob2xkcyBvZiBjYXNoLWJhc2VkIHRyYW5zZmVycyBoYXZlIHJlY2VpdmVkIDUwJSBvciBtb3JlIG9mIHRoZSBNRUIgZm9yIHRoZSBtb250aHMgdGhleSB3ZXJlIGNvdmVyZWQuIEFib3V0IDEwJSBvZiBhbGwgYmVuZWZpY2lhcnkgaG91c2Vob2xkcyBmb3IgbW9udGhseSBjYXNoLWJhc2VkIHRyYW5zZmVycyByZWNlaXZlZCB1bmRlciBVU0QgMjAgcGVyIG1vbnRoIChsZXNzIHRoYW4gMTAlIG9mIHRoZSBNRUIpIGFuZCAyMyUgb2YgaG91c2Vob2xkcyByZWNlaXZlZCBiZXR3ZWVuIFVTRCAyMCBhbmQgVVNEIDQwICgyMiUgb2YgdGhlIE1FQikgLS0gdGhpcyB1bmRlcnNjb3JlcyB0aGUgaW1wb3J0YW5jZSBvZiBzdGFuZGFyZGlzYXRpb24gYW5kIG9mIHRoZSBwcmVzc2luZyBuZWVkIHRvIGNvbGxlY3QgbW9yZSBpbmZvcm1hdGlvbiBvbiB3aGV0aGVyIGNhc2ggdHJhbnNmZXJzIChhbmQgZm9vZCBiYXNrZXRzKSBoYXZlIGJlZW4gZGVzaWduZWQgdG8gYmUgZnVsbCByYXRpb25zLCBoYWxmIHJhdGlvbnMgb3IgYXJlIGluc3RlYWQgaW50ZW5kZWQgdG8gYmUgc3VwcGxlbWVudGFyeSBhY3Rpdml0aWVzLiBUaGlzIGlzIGtleSBmcm9tIGEgY29vcmRpbmF0aW9uIHN0YW5kcG9pbnQgYXMgdGhlIGZvb2Qgc2VjdXJpdHkgbmVlZHMgb2YgdGhvc2Ugd2hvIGhhdmUgcmVjZWl2ZWQgc3VwcGxlbWVudGFyeSB0cmFuc2ZlcnMgY2Fubm90IGJlIGNvbnNpZGVyZWQgdG8gaGF2ZSBiZWVuIGNvdmVyZWQuIA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMy4gUGFydG5lcnMNCg0KT2YgdGhlIGltcGxlbWVudGluZyBwYXJ0bmVycyBvZiB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyLCBhIHRvdGFsIG9mIGByIGZzYyAlPiUgc2VsZWN0KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWAgb2YgdGhlbSBjbGFzc2lmaWVkIHRoZW1zZWx2ZXMgYXMgaW1wbGVtZW50aW5nIHBhcnRuZXJzIHdpdGhpbiB0aGUgNVdzLiBUaGV5IGFyZSBmYWlybHkgZXZlbmx5IHNwbGl0IHRoZW1zZWx2ZXMgYmV0d2VlbiBIUlAgaW5kaWNhdG9ycywgd2l0aCBgciBmc2MgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KGhycF9pbmRpY2F0b3IsICIxLiIpKSAlPiUgc2VsZWN0KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWAgY29udHJpYnV0aW5nIHRvd2FyZHMgZm9vZCBhbmQgY2FzaCBhc3Npc3RhbmNlIGFuZCBgciBmc2MgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KGhycF9pbmRpY2F0b3IsICIyLiIpKSAlPiUgc2VsZWN0KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGRpc3RpbmN0KCkgJT4lIG5yb3coKWAgY29udHJpYnV0aW5nIHRvd2FyZHMgYWdyaWN1bHR1cmUgYW5kIG90aGVyIGxpdmVsaWhvb2Qgc3VwcG9ydC4gYHIgYmVuICU+JSBzdW1fYmVuKGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGZpbHRlcihiZW5lZmljaWFyaWVzIDwgMTAwMDApICU+JSBucm93KClgIHBhcnRuZXJzIGhhdmUgcmVhY2hlZCBsZXNzIHRoYW4gMTAsMDAwIHVuaXF1ZSBiZW5lZmljaWFyaWVzIGFuZCB0aGUgbWVkaWFuIHVuaXF1ZSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgcGFydG5lcnMgaXMgYHIgYmVuICU+JSBzdW1fYmVuKGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIHttZWRpYW4oLiRiZW5lZmljaWFyaWVzKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgLiBCZWxvdyBhcmUgdGhlIHRvcCAxMCBwYXJ0bmVycyBieSBIUlAgaW5kaWNhdG9yLiBBcyBhIHNpZGUgbm90ZSwgaXQgcmVtYWlucyB0byBiZSBjbGFyaWZpZWQgd2hldGhlciBaaWd3YXkgaXMgYSB2ZW5kb3Ivc3VwcGxpZXIgb2YgV0ZQIG9yIGlzIGFuIGltcGxlbWVudGluZyBwYXJ0bmVyIC0tIHNvbWUgZm9sbG93IHVwIHdpdGggd2lsbCBiZSBuZWNlc3Nhcnk7IHRoaXMgaXMgYWxzbyB0cnVlIGZvciB0aGUgdHdvIHByaXZhdGUgbGltaXRlZCBjb21wYW5pZXMgdGhhdCBhbHNvIHdlcmUgcmVwb3J0ZWQgYXMgaW1wbGVtZW50aW5nIHBhcnRuZXJzLg0KDQpgYGB7ciB0YWJsZS10b3AtcGFydG5lcnMtYnktaHJwLWluZGljYXRvcn0NCg0KIyByZW1pbmRlciB0byByZWRvIHRoZSBudW1iZXJzIHdoZW4geW91IHJlcnVuIHRoaXMgd2l0aCBmcmVzaCBkYXRhIA0KDQpjYmluZCgNCiAgDQogIGZzYyAlPiUgDQogICAgZmlsdGVyKGhycF9pbmRpY2F0b3IgPT0gIjEuTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgZm9vZCBhbmQvb3IgY2FzaCBhc3Npc3RhbmNlIiAmDQogICAgICAgICAgICAgYmVuZWZpY2lhcmllc19yZWN1cnJlbmN5ICVpbiUgYygiRmlyc3QiLCAiT25lLW9mZiIpKSAlPiUgDQogICAgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgICByZW5hbWUoYDEuIE51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGZvb2QgYW5kL29yIGNhc2ggYXNzaXN0YW5jZWAgPSBiZW5lZmljaWFyaWVzLA0KICAgICAgICAgICBgUGFydG5lcnMgSFJQIGluZGljYXRvcjFgID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgaGVhZCgxMCksDQogIA0KICBmc2MgJT4lIA0KICAgIGZpbHRlcihocnBfaW5kaWNhdG9yID09ICIyLk51bWJlciBvZiBwZW9wbGUgd2hvIHJlY2VpdmVkIGFncmljdWx0dXJlIGFuZCBvdGhlciBsaXZlbGlob29kIHN1cHBvcnQiICYNCiAgICAgICAgICAgICBiZW5lZmljaWFyaWVzX3JlY3VycmVuY3kgJWluJSBjKCJGaXJzdCIsICJPbmUtb2ZmIikpICU+JSANCiAgICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcnMpICU+JSANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIHJlbmFtZShgMi4gTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgYWdyaWN1bHR1cmUgYW5kIG90aGVyIGxpdmVsaWhvb2Qgc3VwcG9ydGAgPSBiZW5lZmljaWFyaWVzLA0KICAgICAgICAgICBgUGFydG5lcnMgSFJQIGluZGljYXRvcjJgID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogICAgaGVhZCgxMCkNCiAgDQopICU+JSANCiAgYWRkX2NvbHVtbihgIGAgPSAiICIpICU+JSANCiAgcmVsb2NhdGUoYCBgLCAuYWZ0ZXIgPSBgMS4gTnVtYmVyIG9mIHBlb3BsZSB3aG8gcmVjZWl2ZWQgZm9vZCBhbmQvb3IgY2FzaCBhc3Npc3RhbmNlYCkgJT4lIA0KICANCiAga2FibGUoY2FwdGlvbiA9ICJUb3AgMTAgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCwgYnkgSFJQIGluZGljYXRvciIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lICANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJGaWd1cmVzIHJlZmxlY3QgYmVuZWZpY2lhcmllcyByZWFjaGVkIHRocm91Z2ggZGlyZWN0IGltcGxlbWVudGF0aW9uIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KIyBwYW5kZXIoY2FwdGlvbiA9ICJUb3AgMTAgcGFydG5lcnMgYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkLCBieSBIUlAgaW5kaWNhdG9yIikNCg0KYGBgDQoNCjxicj4NCg0KIyMjIDMuMSBEaXN0cmlidXRpb24gb2YgcGFydG5lcnMgYnkgYmVuZWZpY2lhcmllcyBhbmQgZ2VvZ3JhcGhpYyByZWFjaA0KDQpXaGlsc3QgdGhlcmUgaXMgcXVpdGUgYSBiaXQgb2YgdmFyaWF0aW9uIGluIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkLCBwYXJ0bmVycycgZ2VvZ3JhcGhpYyBmb290cHJpbnRzIGFyZSwgb24gdGhlIHdob2xlLCBxdWl0ZSBsaW1pdGVkLiBPbmx5IGByIGJlbiAlPiUgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIGZpbHRlcih0b3duc2hpcHMgPiAxMCkgJT4lIG5yb3coKWAgcGFydG5lcnMgaGF2ZSBhIHByZXNlbmNlIGluIG1vcmUgdGhhbiAxMCB0b3duc2hpcHMsIGFuZCBvbmx5IGByIGJlbiAlPiUgZ3JvdXBfYnkoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIGZpbHRlcih0b3duc2hpcHMgPiA1KSAlPiUgbnJvdygpYCBhcmUgcHJlc2VudCBpbiBtb3JlIHRoYW4gNSB0b3duc2hpcHMuIDc4JSBvZiBvdXIgcGFydG5lcnMgKGNsdXN0ZXJlZCBhbG9uZyB0aGUgYm90dG9tIG9mIHRoZSBjaGFydCkgYXJlIHByZXNlbnQgaW4gNSBvciBsZXNzIHRvd25zaGlwcy4gVGhpcyBkaXN0cmlidXRpb24gb2YgcGFydG5lcnMgaXMgYW4gaW1wZWRpbWVudCB0byBhIGNvdW50cnl3aWRlIHJlc3BvbnNlIGFuZCBpdCBpcyBpbXBlcmF0aXZlIHRvIHVuZGVyc3RhbmQgaG93IGJlc3QgdG8gaW5jZW50aXZpc2UgcGFydG5lcnMgdG8gZXhwYW5kIHRoZWlyIGZvb3RwcmludHMuDQoNCjxicj4NCg0KYGBge3IgcGxvdGx5LXNjYXR0ZXItcGFydG5lcnMtcmVhY2h9DQojIHJlbWluZGVyIHRvIHJlY2FsY3VsYXRlIHRoZSA3OCUgYWJvdmUgaWYgeW91IHJlcnVuIHRoZSBkYXRhIA0KcGFydG5lcl9zY2F0dGVyIDwtIGJlbiAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICBzdW1tYXJpc2Uoc3RhdGVzID0gbl9kaXN0aW5jdChhZG1pbjFfcGNvZGUpLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2Moc3RhdGVzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gdG93bnNoaXBzLCB0ZXh0ID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSkgKyAgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nIiwgbGFiZWxzID0gY29tbWEsIGJyZWFrcyA9IGMoMCwgMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCAzMDAwMDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMzAsIDUpKSArDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgdG93bnNoaXBzIiwNCiAgICAgICB0aXRsZSA9ICJQbG90IG9mIGJlbmVmaWNpYXJpZXMgYW5kIHRvd25zaGlwcyByZWFjaGVkLCBieSBpbXBsZW1lbnRpbmcgcGFydG5lciIpIA0KIyBmb3Igc29tZSByZWFzb24sIHJlbW92aW5nIHRoaXMgbWVzc2VzIHdpdGggdGhlIGFsaWdubWVudCBvZiB0aGUgcGxvdA0KDQpnZ3Bsb3RseShwYXJ0bmVyX3NjYXR0ZXIpICU+JQ0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIlBsb3Qgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQsIGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdXNlIG92ZXIgZm9yIGRldGFpbHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvc3VwPiIpKSkNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjIgTW9udGhseSBwcm9ncmVzcyBieSBwYXJ0bmVyDQoNCmBgYHtyIHBhcnRuZXJzLXByb2dyZXNzLW92ZXItdGltZS1mYWNldH0NCnBhcnRuZXJfdG9wIDwtIGJlbiAlPiUgIA0KICBzdW1fYmVuKGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIHB1bGwoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgaGVhZCgyMCkNCg0KYmVuICU+JSANCiAgZmlsdGVyKGltcGxlbWVudGluZ19wYXJ0bmVycyAlaW4lIHBhcnRuZXJfdG9wKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JQ0KICBtdXRhdGUoaW1wbGVtZW50aW5nX3BhcnRuZXJzID0gZmN0X3Jlb3JkZXIoaW1wbGVtZW50aW5nX3BhcnRuZXJzLCBjdW1fYmVuLCBtYXgsIC5kZXNjID0gVFJVRSkpICU+JSAgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDAuNSkgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGdlb21fdmxpbmUoY29sb3VyID0gInJlZCIsIGx0eSA9IDIsIHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMjEtMDYtMDEiKSkpICsNCiAgZmFjZXRfd3JhcCh+IGltcGxlbWVudGluZ19wYXJ0bmVycywgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMy41KSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDQpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0LjUsIGZhY2UgPSAiYm9sZCIpKSArICMgc2VlIGlmIHRoaXMgd29ya3Mgd2hlbiB5b3Uga25pdCwgdGhlbiBkbyBpdCBmb3IgdGhlIG90aGVyIHBsb3RzIA0KICBsYWJzKHggPSAiTW9udGgiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIk1vbnRobHkgcHJvZ3Jlc3Mgb2YgdG9wIDIwIGltcGxlbWVudGluZyBwYXJ0bmVycywgMjAyMSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkZpZ3VyZXMgc2hvdyBjdW11bGF0aXZlIHVuaXF1ZSBiZW5lZmljaWFyaWVzIikgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKQ0KYGBgDQoNCiA8YnI+DQogDQpUaGUgcGxvdCBhYm92ZSBzaG93cyB0aGUgdG9wIDIwIHBhcnRuZXJzIGJ5IG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gMjAyMSwgd2l0aCB0aGUgcmVkIGxpbmUgaW5kaWNhdGluZyBKdW5lIDIwMjEsIHdoZW4gdGhlIEhSUCBhZGRlbmR1bSB3YXMgYXBwcm92ZWQgYW5kIHB1Ymxpc2hlZC4gT24gdGhlIHdob2xlLCB0aGUgSFJQIGFkZGVuZHVtIGhhZCBhIHZlcnkgbGFyZ2UgZWZmZWN0IG9uIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIC0tIG1vc3QgcGFydG5lcnMgZW5hY3RlZCBhIHNpZ25pZmljYW50IHJhbXAgdXAgYW5kIHJlYWNoZWQgdGhlIG1ham9yaXR5IG9mIGJlbmVmaWNpYXJpZXMgYWZ0ZXIgaXQgd2FzIHB1Ymxpc2hlZC4gRXhjZXB0aW9ucyB0byB0aGlzIGluY2x1ZGUgb3JnYW5pc2F0aW9ucyBzdWNoIGFzIENFU1ZJLCBIZWxlbiBLZWxsZXIgSW50ZXJuYXRpb25hbCwgU2F2ZSB0aGUgQ2hpbGRyZW4gYW5kIE15YW5tYXIgSGVhcnQgRGV2ZWxvcG1lbnQgT3JnYW5pc2F0aW9uLCB3aG8gZXN0YWJsaXNoZWQgbW9zdCBvZiB0aGVpciBjYXNlbG9hZCBwcmlvciB0byBKdWx5IDIwMjEuIFRoZSBuZXh0IGNoYXB0ZXIgd2lsbCBleHBsb3JlIHRoZSBlZmZlY3QgdGhlIEhSUCBhZGRlbmR1bSBoYWQgb24gcGVyc29ucyByZWFjaGVkIGJ5IGJlbmVmaWNpYXJ5IHR5cGUuIA0KDQo8YnI+PGJyPg0KDQojIyMgMy4zIFR5cGVzIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycw0KDQpgYGB7ciB0YWJsZS1pbXBsZW1lbnRpbmctcGFydG5lci10eXBlLCB3YXJuaW5nPUZBTFNFfQ0KZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUsIGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lICANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpLA0KICAgICAgICAgICAgc3RhdGVzID0gbl9kaXN0aW5jdChhZG1pbjFfcGNvZGUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGdyb3VwX2J5KGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19iZW5lZmljaWFyaWVzID0gcm91bmQobWVhbihiZW5lZmljaWFyaWVzKSksDQogICAgICAgICAgICBhdmdfdG93bnNoaXBzID0gcm91bmQobWVhbih0b3duc2hpcHMpLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICBhdmdfc3RhdGVzID0gcm91bmQobWVhbihzdGF0ZXMpLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgIA0KICBtdXRhdGUoaW1wbGVtZW50aW5nX3BhcnRuZXJfdHlwZSA9IGZjdF9yZWxldmVsKGltcGxlbWVudGluZ19wYXJ0bmVyX3R5cGUsIGxldmVscyA9IGMoIklOR08iLCAiTk5HTyIsICJVTiIsICJvdGhlciIpKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkF2ZXJhZ2UgcmVhY2ggYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIgdHlwZSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIkZpZ3VyZXMgYXJlIGF2ZXJhZ2VzIHJlYWNoZWQgYnkgZGlyZWN0IGltcGxlbWVudGF0aW9uIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KICAjIHBhbmRlcihjYXB0aW9uID0gIkF2ZXJhZ2UgcmVhY2ggYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIgdHlwZSIpDQoNCmBgYA0KDQo8YnI+DQpOTkdPcywgb24gYXZlcmFnZSwgdGVuZGVkIHRvIHJlYWNoIG1vcmUgYmVuZWZpY2lhcmllcyB0aGFuIElOR09zLCB0aG91Z2ggSU5HT3MgdGVuZGVkIHRvIGhhdmUgYSBtdWNoIHdpZGVyIGdlb2dyYXBoaWMgcmVhY2ggdGhhbiBOTkdPcywgcGVyaGFwcyBkdWUgdG8gdGhlbSBoYXZpbmcgbW9yZSBzdWItb2ZmaWNlcyBhcyB3ZWxsIGFzIHRoZSBnZW5lcmFsbHkgdGlnaHRlciBmb2N1cyBvZiBzZXZlcmFsIGNvbW11bml0eS1iYXNlZCBvcmdhbmlzYXRpb25zLiBUaGVyZSBpcyBvbmx5IG9uZSBhZ2VuY3kgaW4gdGhlICJVTiIgY2F0ZWdvcnkgLS0gV0ZQOyB0aGUgIm90aGVyIiBjYXRlZ29yeSByZWZlcnMgdG8gdHdvIHByaXZhdGUgbGltaXRlZCBjb21wYW5pZXMgd2hpY2ggYWxzbyBpbXBsZW1lbnRlZCBmb29kIHNlY3VyaXR5IGFjdGl2aXRpZXMuDQoNCjxicj48YnI+DQoNCiMjIyAzLjQgUmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMNCg0KVGhlcmUgYXJlIGByIGZzYyAlPiUgZGlzdGluY3QocmVwb3J0aW5nX29yZ2FuaXphdGlvbiwgaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgbnJvdygpYCBjb21iaW5hdGlvbnMgYmV0d2VlbiByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucyBhbmQgaW1wbGVtZW50aW5nIHBhcnRuZXJzLCBgciBmc2MgJT4lIGRpc3RpbmN0KHJlcG9ydGluZ19vcmdhbml6YXRpb24sIGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGZpbHRlcihyZXBvcnRpbmdfb3JnYW5pemF0aW9uID09IGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIG5yb3coKWAgb2Ygd2hpY2ggYXJlIGluc3RhbmNlcyB3aGVyZSB0aGUgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbiBhbmQgdGhlIGltcGxlbWVudGluZyBwYXJ0bmVyIGFyZSB0aGUgc2FtZSBvcmdhbmlzYXRpb247IG9uY2UgdGhlc2UgYXJlIGZpbHRlcmVkIG91dCwgYWxsIHRoZSByZW1haW5pbmcgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGNvcnJlc3BvbmQgdG8ganVzdCBgciBmc2MgJT4lIGZpbHRlcihyZXBvcnRpbmdfb3JnYW5pemF0aW9uICE9IGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIGRpc3RpbmN0KHJlcG9ydGluZ19vcmdhbml6YXRpb24pICU+JSBucm93KClgIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zOg0KDQpgYGB7ciB0YWJsZS1yZXBvcnRpbmctb3JnYW5pc2F0aW9ufQ0KZnNjICU+JSANCiAgZmlsdGVyKHJlcG9ydGluZ19vcmdhbml6YXRpb24gIT0gaW1wbGVtZW50aW5nX3BhcnRuZXJzKSAlPiUgDQogIGdyb3VwX2J5KHJlcG9ydGluZ19vcmdhbml6YXRpb24pICU+JSANCiAgc3VtbWFyaXNlKGltcGxlbWVudGluZ19wYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIk51bWJlciBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYnkgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbiIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikNCiMgcGFuZGVyKGNhcHRpb24gPSAiTnVtYmVyIG9mIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSByZXBvcnRpbmcgb3JnYW5pc2F0aW9uIikNCmBgYA0KDQo8YnI+DQoNClRoaXMgcmVwb3J0IGhhcyB1c2VkIGBpbXBsZW1lbnRpbmdfcGFydG5lcnNgIGZvciBtb3N0IG9mIHRoZSBhbmFseXNpcyBhcywgYnkgdGhlaXIgbmF0dXJlLCByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucyBkbyBub3QgaGF2ZSBhIGZpZWxkIHByZXNlbmNlLiBBcyBhIHNpZGUgbm90ZSwgRkFPIGhhcyBub3QgY2xhc3NpZmllZCBpdHNlbGYgYXMgYW4gaW1wbGVtZW50aW5nIHBhcnRuZXIsIGhhdmluZyByZXBvcnRlZCBubyBhY3Rpdml0aWVzIHRoYXQgd2VyZSBkaXJlY3RseSBpbXBsZW1lbnRlZCBieSB0aGVtLg0KDQo8YnI+PGJyPg0KDQoNCiMjIyAzLjUgRG9ub3JzDQoNCmByIHJvdW5kKHN1bSgoIWlzLm5hKGZzYyRkb25vcikpKSAvIG5yb3coZnNjKSAqIDEwMCwgZGlnaXRzID0gMClgJSBvZiB0aGUgcm93cyBoYWQgdGhlIGBkb25vcmAgY29sdW1uIGZpbGxlZC4gSG93ZXZlciwgdGhpcyBvbmx5IHJlcHJlc2VudHMgYWN0aXZpdGllcyByZWFjaGluZyAyMyUgb2YgYWxsIGJlbmVmaWNpYXJpZXMuIEJlbG93IGlzIGEgdGFibGUgb2YgdGhlIDEwIGRvbm9ycyAoYWZ0ZXIgb3JnYW5pc2F0aW9ucyB1c2luZyB0aGVpciBvd24gcmVzb3VyY2VzKSB3aG9zZSBmdW5kaW5nICBoYXMgcmVhY2hlZCB0aGUgbW9zdCBiZW5lZmljaWFyaWVzIGFuZCB0aGUgbnVtYmVyIG9mIHRvd25zaGlwcyB0aGVpciBmdW5kaW5nIGhhcyBiZWVuIHVzZWQgaW46DQoNCmBgYHtyIGRvbm9yLXRhYmxlfQ0KZnNjICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogIGdyb3VwX2J5KGRvbm9yKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgDQogIG11dGF0ZShwY19vZl9iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICByZWxvY2F0ZShwY19vZl9iZW4sIC5hZnRlciA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgZmlsdGVyKCFpcy5uYShkb25vcikpICU+JSANCiAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGhlYWQoMTEpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUb3AgMTAgZG9ub3JzIGJ5IG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgd2l0aCB0aGVpciBmdW5kaW5nIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIobGlnaHRhYmxlX29wdGlvbnMgPSBjKCJzdHJpcGVkIikpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICI3NyUgb2YgYWxsIGJlbmVmaWNpYXJpZXMgKDIsNTEzLDAyNiBwZXJzb25zKSB3ZXJlIHJlcG9ydGVkIHdpdGggdGhlIGBkb25vcmAgY29sdW1uIGxlZnQgYmxhbmsiLCBnZW5lcmFsX3RpdGxlID0gIiIpDQojIHBhbmRlcihjYXB0aW9uID0gIlRvcCAxMCBkb25vcnMgYnkgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCB3aXRoIHRoZWlyIGZ1bmRpbmciKQ0KYGBgDQoNCjxicj4NCg0KQWRkaXRpb25hbGx5LCBhIG51bWJlciBvZiBlcnJvcnMgaGF2ZSBhbHNvIGJlZW4gb2JzZXJ2ZWQsIGluY2x1ZGluZyBjYXNlcyB3aGVyZSBtdWx0aXBsZSBkb25vcnMgaGF2ZSBiZWVuIGNvbWJpbmVkIGludG8gb25lIHJvdyBhcyB3ZWxsIGFzIG51bWVyb3VzIGluc3RhbmNlcyB3aGVyZSBVTkRQLCBXRlAsIEZBTyBhbmQgVU4gV09NRU4gd2VyZSBjbGFzc2lmaWVkIGFzIGRvbm9ycyBhcyBvcHBvc2VkIHRvIHJlcG9ydGluZyBvcmdhbmlzYXRpb25zLiBIZWx2ZXRhcyBzaG91bGQgYWxzbyBwcm9iYWJseSBoYXZlIHJlcG9ydGVkIHVuZGVyICJvcmdhbmlzYXRpb25zIHVzaW5nIHRoZWlyIG93biBmdW5kcyIuIA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNC4gQmVuZWZpY2lhcmllcw0KDQojIyMgNC4xIEJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9ucw0KDQpDdXJyZW50bHksIGluIHRoZSA1V3MsIHRoZSB2YXN0IG1ham9yaXR5IG9mIGJlbmVmaWNpYXJ5IGRpYXNhZ2dyZWdhdGlvbnMgaGF2ZSBiZWVuIGJhY2tmaWxsZWQgZnJvbSBjZW5zdXMgZGF0YSBhbmQgZG8gbm90LCBjb25zZXF1ZW50bHksIHByb3ZpZGUgYW4gYWNjdXJhdGUgcGljdHVyZSBvZiB0aGUgcG9wdWxhdGlvbiB0aGF0IGhhdmUgYmVlbiByZWFjaGVkIGJ5IEZvb2QgU2VjdXJpdHkgaW50ZXJ2ZW50aW9ucy4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGRldGVybWluZSBob3cgZmFyIHJlYWxpdHkgZGl2ZXJnZXMgZnJvbSB3aGF0IGhhcyBiZWVuIHJlcG9ydGVkIHNvIGZhciAtLSBtZWFuaW5nIHRoYXQgaXQgY2Fubm90IGJlIGRldGVybWluZWQgaWYgdGhlcmUgaGFzIGJlZW4gYW55IGJpYXMgaW4gYmVuZWZpY2lhcnkgc2VsZWN0aW9uIGFuZCB0YXJnZXR0aW5nLiBJdCBpcyBpbXBlcmF0aXZlIHRvIGJlZ2luIGNvbGxlY3RpbmcgZGlzYWdncmVnYXRlZCBiZW5lZmljaWFyeSBkYXRhIGZyb20gcGFydG5lcnMuDQoNCkl0IGlzIGVudGlyZWx5IHBvc3NpYmxlIHRoYXQgcGFydG5lcnMgYXJlIGNvbGxlY3RpbmcgdGhpcyBkYXRhIC0tIGRpc2FnZ3JlZ2F0ZWQgYmVuZWZpY2lhcnkgZGF0YSBpcyBvbmUgb2YgdGhlIG1vc3QgY29tbW9uIGRhdGEgcmVxdWlyZWQgZm9yIGludGVybmFsIGFuZCBleHRlcm5hbCByZXBvcnRpbmcgLS0gYW5kIHRoYXQgaXQgaXMgbWVyZWx5IG5lY2Vzc2FyeSB0byB3b3JrIHdpdGggcGFydG5lcnMgdG8gd3JhbmdsZSB0aGVpciBkYXRhIGludG8gdGhlIDVXIGZvcm1hdC4gSG93ZXZlciwgdGhlIGNhcGFjaXRpZXMgb2YgcGFydG5lcnMgdG8gZGlzYWdncmVnYXRlIGJlbmVmaWNpYXJ5IGRhdGEgc2hvdWxkIGJlIGludmVzdGlnYXRlZCBieSB0aGUgY2x1c3RlciBhbmQgaXMgYW4gaW1wb3J0YW50IGlzc3VlIHRoYXQgc2hvdWxkIGJlIGJyb3VnaHQgdXAgaW4gdGhlIG5leHQgcGxlbmFyeSBzZXNzaW9uLg0KDQoNCjxicj48YnI+DQoNCiMjIyA0LjIgVHlwZXMgb2YgYmVuZWZpY2lhcmllcw0KDQpgYGB7ciBiZW5lZmljaWFyeS10eXBlLWRhdGFzZXR9DQpiZW5fdHlwZSA8LSBmc2MgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgdW5pcXVlX2JlbmVmaWNpYXJpZXMgPT0gIlllcyIpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lDQogIGFkb3JuX3BlcmNlbnRhZ2VzKGRlbm9taW5hdG9yID0gImNvbCIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcmllcyA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgKiAxMDAsIGRpZ2l0cyA9IDIpKQ0KYGBgDQoNClRoZSBzdGF0ZXMgYW5kIHJlZ2lvbnMgaW4gd2hpY2ggdGhlIEZTQyBpcyB3b3JraW5nIHRoZSBtb3N0IHdpdGggSURQcyBhcmUgQmFnbyAoRWFzdCksIEthY2hpbiwgQ2hpbiwgU2hhbiAoTm9ydGgpIGFuZCBLYXlhaC4gT3ZlcmFsbCwgYHIgYmVuX3R5cGUgJT4lIGZpbHRlcihiZW5lZmljaWFyeV90eXBlID09ICJIb3N0L2xvY2FsIENvbW11bml0eSIpICU+JSBwdWxsKGJlbmVmaWNpYXJpZXMpYCUgb2YgYmVuZWZpY2lhcmllcyBhcmUgZnJvbSB0aGUgaG9zdC9sb2NhbCBjb21tdW5pdHksIGByIGJlbl90eXBlICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiUmFraGluZSBzdGF0ZWxlc3MiKSAlPiUgcHVsbChiZW5lZmljaWFyaWVzKWAlIGFyZSBzdGF0ZWxlc3MgcGVyc29ucyBmcm9tIFJha2hpbmUgYW5kIGByIGJlbl90eXBlICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiSW50ZXJuYWxseSBEaXNwbGFjZWQiKSAlPiUgcHVsbChiZW5lZmljaWFyaWVzKWAlIGFyZSBJRFBzLiBSZXR1cm5lZXMgYXJlIHRoZSByYXJlc3QgdHlwZSBvZiBiZW5lZmljaWFyeSByZWFjaGVkLCBmb3JtaW5nIG9ubHkgYHIgYmVuX3R5cGUgJT4lIGZpbHRlcihiZW5lZmljaWFyeV90eXBlID09ICJSZXR1cm5lZXMiKSAlPiUgcHVsbChiZW5lZmljaWFyaWVzKWAlIG9mIGFsbCBiZW5lZmljaWFyaWVzIHJlYWNoZWQuIEVhY2ggcm93IGluIHRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgcGVyY2VudGFnZSBvZiBlYWNoIGJlbmVmaWNpYXJ5IHR5cGUgd2l0aGluIGVhY2ggc3RhdGUvcmVnaW9uLg0KDQpgYGB7ciB0YWJsZS1iZW5lZmljaWFyeS10eXBlcy1zdGF0ZX0NCmZzYyAlPiUgDQogIGZpbHRlcighaXMubmEoYmVuZWZpY2lhcnlfdHlwZSkgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBncm91cF9ieShzdGF0ZSwgYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lICANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGJlbmVmaWNpYXJ5X3R5cGUsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcykgJT4lIA0KICBhZG9ybl90b3RhbHMod2hlcmUgPSAicm93IiwgbmEucm0gPSBUUlVFKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKGRlbm9taW5hdG9yID0gInJvdyIsIG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoYWNyb3NzKC1zdGF0ZSwgfiByb3VuZCguICogMTAwLCBkaWdpdHMgPSAyKSkpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcighaXMubmEoYmVuZWZpY2lhcnlfdHlwZSkgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lDQogICAgICAgICAgICAgIHN1bV9iZW4oc3RhdGUpLCBieSA9ICJzdGF0ZSIpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJQZXJjZW50YWdlIGJyZWFrZG93biBvZiBiZW5lZmljaWFyeSB0eXBlcyBieSBzdGF0ZS9yZWdpb24iLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMihsaWdodGFibGVfb3B0aW9ucyA9ICJzdHJpcGVkIikNCiMgcGFuZGVyKGNhcHRpb24gPSAiUGVyY2VudGFnZSBicmVha2Rvd24gb2YgYmVuZWZpY2lhcnkgdHlwZXMgYnkgc3RhdGUvcmVnaW9uIikNCg0KYGBgDQoNCjxicj4NCg0KQ29tcGFyZWQgdG8gb25seSB0aGUgMjAyMSBIUlAgdGFyZ2V0cyAoYXMgdGhlIElFUlAgZG9lcyBub3QgaGF2ZSBicmVha2Rvd25zIG9mIHRoZSB0YXJnZXQgYnkgYmVuZWZpY2lhcnkgdHlwZSksIGJlZW5maWNpYXJ5IHR5cGUgdGFyZ2V0cyBoYXZlIGJlZW4gbW9zdGx5IGV4Y2VlZGVkLCBuZWl0aGVyIHRoZSB0YXJnZXRzIGZvciByZXR1cm5lZXMvcmVzZXR0bGVkIGluIEthY2hpbiBvciBTaGFuIChOb3J0aCkgbm9yIHRhcmdldHMgZm9yIElEUHMgaW4gUmFraGluZSBvciBLYXlpbiBoYXZlIGJlZW4gbWV0LiBJbnRlcmVzdGluZ2x5LCBmb3IgUmFraGluZSwgdGhlIHRhcmdldHMgZm9yIHRoZSBob3N0L2xvY2FsIHBvcHVsYXRpb24gaGF2ZSBiZWVuIGdyZWF0bHkgZXhjZWVkZWQgYW5kIHZhcmlvdXMgYXNzdW1wdGlvbnMgY2FuIGJlIGZvcm11bGF0ZWQgcmVnYXJkaW5nIHRoaXM6DQoNCiogT25jZSB0YXJnZXRzIHdlcmUgbWV0LCBhbGwgZnVydGhlciBhbGxvY2F0aW9ucyB3ZXJlIHRhcmdldHRlZCBhdCB0aGUgbG9jYWwvaG9zdCBjb21tdW5pdHkgcG9wdWxhdGlvbiANCiogVGhlcmUgd2FzIGJldHRlciBpbnRlZ3JhdGlvbiBvZyB0aGUgaG9zdCBwb3B1bGF0aW9uIGludG8gcmVsaWVmIHByb2dyYW1taW5nDQoqIEdyZWF0ZXIgYXZhaWxhYmlsaXR5IG9mIGZ1bmRzIGFoZCB0aGUgcHJlc2VuY2Ugb2YgZGV2ZWxvcG1lbnQgZG9ub3JzDQoNCkluIEJhZ28gKEVhc3QpLCBDaGluLCBLYXlpbiBhbmQgcGFydGljdWxhcmx5IFNoYW4gKE5vcnRoKSwgdGhlIHRhcmdldHMgZm9yIElEUHMgaGF2ZSBiZWVuIGdyZWF0bHkgZXhjZWVkZWQsIGluIGNvbXBhcmlzb24gdG8gdGhlIDIwMjEgSFJQIHRhcmdldHMuDQoNCmBgYHtyIHRhYmxlLWJlbmVmaWNpYXJ5LXR5cGUtcmVhY2hlZC1ocnAtdGFyZ2V0fQ0KIyByZW1pbmRlciB0byBjaGVjayB0aGUgdGV4dCBpbiB0aGUgcGFyYWdyYXBoIGFib3ZlIHdoZW4geW91IHJlcnVuIHRoZSByZXBvcnQgd2l0aCBkYXRhDQpwaW4gJT4lDQogIGZpbHRlcihocnBfdGFyZ2V0X3RvdGFsID4gMCkgJT4lIA0KICBzZWxlY3Qoc3RhdGUsIGFkbWluM19wY29kZSwgaHJwX3RhcmdldF9pZHBzXzIwMjEsIGhycF90YXJnZXRfcmV0dXJuZWVzXzIwMjEsIGhycF90YXJnZXRfc3RhdGVsZXNzX3Jha2hpbmVfMjAyMSwgDQogICAgICAgICAgICAgICAgICAgICBocnBfdGFyZ2V0X290aGVyX3Z1bG5lcmFibGVfMjAyMSwgaHJwX3RhcmdldF90b3RhbCkgJT4lIA0KICBsZWZ0X2pvaW4oZnNjICU+JSANCiAgICAgICAgICAgIGZpbHRlcighaXMubmEoYmVuZWZpY2lhcnlfdHlwZSkgJiB1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIiAmIGhycF9pZXJwICE9ICJub25faHJwIikgJT4lIA0KICBncm91cF9ieShhZG1pbjNfcGNvZGUsIGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gYmVuZWZpY2lhcnlfdHlwZSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9iZW5lZmljaWFyaWVzID0gcm93U3VtcyhhY3Jvc3Mod2hlcmUoaXMubnVtZXJpYykpLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBjbGVhbl9uYW1lcygpICU+JQ0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZV9hdCh2YXJzKGhycF90YXJnZXRfaWRwc18yMDIxOnRvdGFsX2JlbmVmaWNpYXJpZXMpLCB+c3VtKC4pKSAlPiUgDQogIG11dGF0ZShob3N0X2xvY2FsX3BjID0gaG9zdF9sb2NhbF9jb21tdW5pdHkgLyBocnBfdGFyZ2V0X290aGVyX3Z1bG5lcmFibGVfMjAyMSAqIDEwMCwgDQogICAgICAgICBpZHBfcGMgPSBpbnRlcm5hbGx5X2Rpc3BsYWNlZCAvIGhycF90YXJnZXRfaWRwc18yMDIxICogMTAwLA0KICAgICAgICAgcmV0dXJuZWVzX3BjID0gcmV0dXJuZWVzIC8gaHJwX3RhcmdldF9yZXR1cm5lZXNfMjAyMSAqIDEwMCwNCiAgICAgICAgIHJha2hpbmVfc3RhdGVsZXNzX3BjID0gcmFraGluZV9zdGF0ZWxlc3MgLyBocnBfdGFyZ2V0X3N0YXRlbGVzc19yYWtoaW5lXzIwMjEgKiAxMDAsDQogICAgICAgICB0b3RhbF9wYyA9IHRvdGFsX2JlbmVmaWNpYXJpZXMgLyBocnBfdGFyZ2V0X3RvdGFsICogMTAwKSAlPiUgDQogIHNlbGVjdChzdGF0ZSwgaG9zdF9sb2NhbF9wYywgaWRwX3BjLCByZXR1cm5lZXNfcGMsIHJha2hpbmVfc3RhdGVsZXNzX3BjLCB0b3RhbF9wYykgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGhvc3RfbG9jYWxfcGMsIGlkcF9wYywgcmV0dXJuZWVzX3BjLCByYWtoaW5lX3N0YXRlbGVzc19wYywgdG90YWxfcGMpLCB+IHJlcGxhY2UoLiwgaXMubmFuKC4pLCBOQSkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhob3N0X2xvY2FsX3BjLCBpZHBfcGMsIHJldHVybmVlc19wYywgcmFraGluZV9zdGF0ZWxlc3NfcGMsIHRvdGFsX3BjKSwgfiByZXBsYWNlKC4sIGlzLmluZmluaXRlKC4pLCBOQSkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhob3N0X2xvY2FsX3BjLCBpZHBfcGMsIHJldHVybmVlc19wYywgcmFraGluZV9zdGF0ZWxlc3NfcGMsIHRvdGFsX3BjKSwgfiByb3VuZCguLCBkaWdpdHMgPSAyKSkgJT4lDQogIHJlbmFtZShgaG9zdF9sb2NhbCVgID0gaG9zdF9sb2NhbF9wYywNCiAgICAgICAgIGBpZHAlYCA9IGlkcF9wYywNCiAgICAgICAgIGByZXR1cm5lZXMlYCA9IHJldHVybmVlc19wYywNCiAgICAgICAgIGByYWtoaW5lX3N0YXRlbGVzcyVgID0gcmFraGluZV9zdGF0ZWxlc3NfcGMsDQogICAgICAgICBgdG90YWwlYCA9IHRvdGFsX3BjKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiUGVyY2VudGFnZSBvZiAyMDIxIEhSUCB0YXJnZXQgcmVhY2hlZCBieSBiZW5lZmljaWFyeSB0eXBlIikgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgIA0KICBmb290bm90ZSgiT25seSBIUlAvSUVSUCBiZW5lZmljaWFyaWVzIGhhdmUgYmVuIGluY2x1ZGVkIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KICAjIHBhbmRlcihjYXB0aW9uID0gIlBlcmNlbnRhZ2Ugb2YgMjAyMSBIUlAgdGFyZ2V0IHJlYWNoZWQgYnkgYmVuZWZpY2lhcnkgdHlwZSIpDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpTdGF0ZWxlc3MgcGVyc29ucyBmcm9tIFJha2hpbmUgaGF2ZSB0aGUgbGFyZ2VzdCBhdmVyYWdlIGhvdXNlaG9sZCBzaXplcywgd2l0aCByZXR1cm5lZXMgaGF2aW5nIHRoZSBsYXJnZXN0IHZhcmlhdGlvbnMgaW4gaG91c2Vob2xkIHNpemUuIFdpdGggcmVmZXJlbmNlIHRvIHRoZSBwbG90IGJlbG93LCB0aGUgdGhpY2sgYmFyIGluIHRoZSBtaWRkbGUgb2YgZWFjaCBib3ggc2hvd3MgdGhlIGF2ZXJhZ2UgaG91c2Vob2xkIHNpemUgZm9yIGVhY2ggYmVuZWZpY2lhcnkgdHlwZSAtLSB0aGlzIHZhbHVlIGlzIGFsc28gc2hvd24gaW4gdGhlIHRleHQgbGFiZWwgYmVsb3cgdGhlIGxpbmUuIFRoZSBsb3dlciBhbmQgdXBwZXIgYm9yZGVycyBvZiBlYWNoIGJveCBpbmRpY2F0ZSB0aGUgdmFsdWVzIGZvciB0aGUgMjV0aCBhbmQgNzV0aCBwZXJjZW50aWxlcyByZXNwZWN0aXZlbHkuIEZvciBpbnN0YW5jZSwgaG91c2Vob2xkcyBhdCB0aGUgMjV0aCBwZXJjZW50aWxlIG9mIGhvdXNlaG9sZHMgaW4gaG9zdC9sb2NhbCBjb21tdW5pdGllcyBoYXZlIG9ubHkgZm91ciBtZW1iZXJzIGFuZCBob3VzZWhvbGRzIHRoYXQgaGF2ZSBhcm91bmQgNSBtZW1iZXJzIGhhdmUgbW9yZSBtZW1iZXJzIHRoYW4gNzUlIG9mIGFsbCB0aGUgaG91c2Vob2xkcyBpbiB0aGF0IGdyb3VwLiBPdXRsaWVycyBhcmUgbWFya2VkIGJ5IGRvdHMuIEEgbG90IG9mIHBvdGVudGlhbCBkYXRhIGVudHJ5IGVycm9ycyB3ZXJlIG9ic2VydmVkLCBlc3BlY2lhbGx5IHdoZXJlIGxlc3MgdGhhbiBvbmUgcGVyc29uIHBlciBob3VzZWhvbGQgd2FzIHJlcG9ydGVkLg0KDQo8YnI+DQoNCmBgYHtyIGJveHBsb3QtaG91c2Vob2xkLXNpemUtYmVuZWZpY2lhcnktdHlwZX0NCg0KIyB0aGlzIGlzIGZvciB0aGUgbGFiZWxzIGZvciB0aGUgYm94cGxvdA0KaGhkX2xhYnMgPC0gZnNjICU+JSAgDQogIGZpbHRlcihiZW5lZmljaWFyeV90eXBlICE9ICJOQSIpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBob3VzZWhvbGRzID0gc3VtKGhvdXNlaG9sZHMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKGF2Z19oaGRfc2l6ZSA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBob3VzZWhvbGRzLCBkaWdpdHMgPSAyKSkgIA0KIA0KDQojIGZvciBzb21lIHJlYXNvbiwgdGhlIG11dGF0ZSBmY3RfcmVvcmRlciBpcyBub3Qgd29ya2luZw0KIyB5b3UgZmlndXJlZCB0aGlzIG91dCBidXQgaGF2ZSBuZWdsZWN0ZWQgdG8gd3JpdGUgdGhlIGFuc3dlciBoZXJlIA0KIA0KZnNjICU+JSANCiAgZmlsdGVyKGJlbmVmaWNpYXJ5X3R5cGUgIT0gIk5BIikgJT4lIA0KICBncm91cF9ieShiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogIG11dGF0ZShhdmdfaGhkX3NpemUgPSBiZW5lZmljaWFyaWVzIC8gaG91c2Vob2xkcywgbmEucm0gPSBUUlVFKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGZjdF9yZW9yZGVyKGJlbmVmaWNpYXJ5X3R5cGUsIGF2Z19oaGRfc2l6ZSksIHkgPSBhdmdfaGhkX3NpemUpKSArIA0KICBnZW9tX2JveHBsb3QoKSArDQogIGdlb21fdGV4dChkYXRhID0gaGhkX2xhYnMsIGFlcyhsYWJlbCA9IGF2Z19oaGRfc2l6ZSksIHNpemUgPSAyLjUsIHZqdXN0ID0gLTEpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxNCwgMiksIGxpbWl0cyA9IGMoMCwxNCkpICsNCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiQXZlcmFnZSBob3VzZWhvbGQgc2l6ZSIsDQogICAgICAgdGl0bGUgPSAiQXZlcmFnZSBob3VzZWhvbGQgc2l6ZSBieSBiZW5lZmljaWFyeSB0eXBlcyIpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC4zIE1vbnRobHkgcHJvZ3Jlc3MgYnkgYmVuZWZpY2lhcnkgdHlwZQ0KDQpgYGB7ciBiZW5lZmljaWFyeS10eXBlcy1wcm9ncmVzcy1vdmVyLXRpbWUtZmFjZXR9DQpiZW4gJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpKSAlPiUgDQogIGdyb3VwX2J5KGJlbmVmaWNpYXJ5X3R5cGUpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUNCiAgbXV0YXRlKGJlbmVmaWNpYXJ5X3R5cGUgPSBmY3RfcmVvcmRlcihiZW5lZmljaWFyeV90eXBlLCBjdW1fYmVuLCBtYXgsIC5kZXNjID0gVFJVRSkpICU+JSAgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fYmVuKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDAuNykgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGdlb21fdmxpbmUoY29sb3VyID0gInJlZCIsIGx0eSA9IDIsIHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMjEtMDYtMDEiKSkpICsNCiAgZmFjZXRfd3JhcCh+IGJlbmVmaWNpYXJ5X3R5cGUsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcpKSArICMgc2VlIGlmIHRoaXMgd29ya3Mgd2hlbiB5b3Uga25pdCwgdGhlbiBkbyBpdCBmb3IgdGhlIG90aGVyIHBsb3RzIA0KICBsYWJzKHggPSAiTW9udGgiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIk1vbnRobHkgcHJvZ3Jlc3MgYnkgYmVuZWZpY2lhcnkgdHlwZSwgMjAyMSIpICsgDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkNCg0KYGBgDQoNCjxicj4NCg0KV2hpbHN0IHRoZSBudW1iZXJzIG9mIElEUHMgYW5kIFJldHVybmVlcyByZWFjaGVkIGRpZCBzZWUgc2lnbmlmaWNhbnQgaW5jcmVhc2VzIGFmdGVyIEp1bmUgMjAyMSwgbm8gZXZpZGVuY2Ugd2FzIG9ic2VydmVkIHRoYXQgdGhpcyB3YXMgdGhlIHJlc3VsdCBvZiB0aGUgSFJQIGFkZGVuZHVtLCByYXRoZXIgdGhhbiB0aGUgY29udGludWF0aW9uIG9mIGFscmVhZHkgZXhpc3RpbmcgcGxhbnMuIEhvd2V2ZXIsIGEgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gdGhlIG51bWJlcnMgb2YgcGVyc29ucyBpbiB0aGUgaG9zdC9sb2NhbCBjb21tdW5pdHkgcmVhY2hlZCBhZnRlciBKdW5lIDIwMjEgaGFzIGJlZW4gbm90ZWQgLS0gYWxtb3N0IGFsbCBob3N0L2xvY2FsIGNvbW11bml0eSBiZW5lZmljaWFyaWVzIHdlcmUgcmVhY2hlZCBhZnRlciB0aGUgcHVibGljYXRpb24gb2YgdGhlIEhSUCBhZGRlbmR1bS4gQ29udmVyc2VseSwgdGhlIHByb2dyZXNzIGFtb25nc3Qgc3RhdGVsZXNzIHBlcnNvbnMgaW4gUmFraGluZSBzbG93ZWQgc3Vic3RhbnRpYWxseSBhZnRlciB0aGUgcHVibGljYXRpb24gb2YgdGhlIGFkZGVuZHVtLiANCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1iZW4tdHlwZS1iZWZvcmUtYWZ0ZXItaWVycH0NCmZzYyAlPiUgDQogIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGJlbmVmaWNpYXJ5X3R5cGUpICYgaHJwX2llcnAgIT0gIm5vbl9ocnAiKSAlPiUgDQogIG11dGF0ZShhZnRlcl9ocnAgPSBpZmVsc2UoZGF0ZSA+ICIyMDIxLTA1LTAxIiwgImFmdGVyX2FkZGVuZHVtIiwgImJlZm9yZV9hZGRlbmR1bSIpKSAlPiUgDQogIHN1bV9iZW4yKGFmdGVyX2hycCwgYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gYWZ0ZXJfaHJwLCB2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMpICU+JSANCiAgYWRvcm5fdG90YWxzKCJjb2wiKSAlPiUgDQogIG11dGF0ZShgJWJlZm9yZWAgPSByb3VuZChiZWZvcmVfYWRkZW5kdW0gLyBUb3RhbCAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICBgJWFmdGVyYCA9IHJvdW5kKGFmdGVyX2FkZGVuZHVtIC8gVG90YWwgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIHJlbG9jYXRlKGJlZm9yZV9hZGRlbmR1bSwgLmFmdGVyID0gYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlJlYWNoZWQgYnkgYmVuZWZpY2lhcnkgdHlwZSwgYmVmb3JlIGFuZCBhZnRlciBIUlAgYWRkZW5kdW0iLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigpICU+JSAgDQogIGZvb3Rub3RlKCJPbmx5IEhSUC9JRVJQIGJlbmVmaWNpYXJpZXMgYXJlIGluY2x1ZGVkIiwgDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiMgcGFuZGVyKGNhcHRpb24gPSAiUmVhY2hlZCBieSBiZW5lZmljaWFyeSB0eXBlLCBiZWZvcmUgYW5kIGFmdGVyIEhSUCBhZGRlbmR1bSIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDQuNCBHYXBzIGluIG1vbnRobHkgcHJvZ3JhbW1pbmcNCg0KYGBge3IgdGFibGUtZ2Fwcy1tb250aHN9DQojIEkgZmVlbCBsaWtlIHRoaXMgaXMgdGhlIG1vc3QgaW5lZmZpY2llbnQgd2F5IHRvIGRvIHRoaXM7IHN0aWxsIHdvcmtzLCB0aG91Z2ggDQojIHlvdSdyZSBnb2luZyB0byBuZWVkIHRvIHJld3JpdGUgdGhpcyB3aGVuIHlvdSBoYXZlIFE0IGRhdGEgDQpnYXBfbW9udGhzIDwtIGZzYyAlPiUgDQogIGZpbHRlcihmcmVxdWVuY3kgPT0gIk1vbnRobHkiICYgYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgZ3JvdXBfYnkoZGF0ZSwgaW1wbGVtZW50aW5nX3BhcnRuZXJzLCBhY3Rpdml0eSwgc3RhdGUsIHRvd25zaGlwLCBsb2NhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZGF0ZSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIHVubmVzdCgpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHJlY3VycmVuY2VzID0gcm93U3VtcyghaXMubmEoc2VsZWN0KC4sIC1pbXBsZW1lbnRpbmdfcGFydG5lcnMsIC1hY3Rpdml0eSwgLXN0YXRlLCAtdG93bnNoaXAsIC1sb2NhdGlvbikpKSwNCiAgICAgICAgIGJlbl9tYXggPSBwbWF4KGAyMDIxLTAxLTAxYCwgYDIwMjEtMDItMDFgLCBgMjAyMS0wMy0wMWAsIGAyMDIxLTA0LTAxYCwgYDIwMjEtMDUtMDFgLCBgMjAyMS0wNi0wMWAsDQogICAgICAgICAgICAgICAgICAgICAgICBgMjAyMS0wNy0wMWAsIGAyMDIxLTA4LTAxYCwgYDIwMjEtMDktMDFgLCBgMjAyMS0xMC0wMWAsIGAyMDIxLTExLTAxYCwgYDIwMjEtMTItMDFgLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKGAyMDIxLTAxLTAxYCwgYDIwMjEtMDItMDFgLCBgMjAyMS0wMy0wMWAsIGAyMDIxLTA0LTAxYCwgYDIwMjEtMDUtMDFgLCBgMjAyMS0wNi0wMWAsDQogICAgICAgICAgICAgICAgICAgICAgICBgMjAyMS0wNy0wMWAsIGAyMDIxLTA4LTAxYCwgYDIwMjEtMDktMDFgLCBgMjAyMS0xMC0wMWAsIGAyMDIxLTExLTAxYCwgYDIwMjEtMTItMDFgKSwgDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJkYXRlIiwgdmFsdWVzX3RvID0gImJlbmVmaWNpYXJpZXMiKSAlPiUgDQogIG11dGF0ZShkaXN0cmlidXRpb24gPSBpZmVsc2UoaXMubmEoYmVuZWZpY2lhcmllcyksICJuIiwgInkiKSkgJT4lIA0KICBzZWxlY3QoLWJlbmVmaWNpYXJpZXMpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGRhdGUsIHZhbHVlc19mcm9tID0gZGlzdHJpYnV0aW9uKSAlPiUgDQogIG11dGF0ZShnYXBzID0gcGFzdGUwKGAyMDIxLTAxLTAxYCwgYDIwMjEtMDItMDFgLCBgMjAyMS0wMy0wMWAsIGAyMDIxLTA0LTAxYCwgYDIwMjEtMDUtMDFgLCBgMjAyMS0wNi0wMWAsDQogICAgICAgICAgICAgICAgICAgICAgICBgMjAyMS0wNy0wMWAsIGAyMDIxLTA4LTAxYCwgYDIwMjEtMDktMDFgLCBgMjAyMS0xMC0wMWAsIGAyMDIxLTExLTAxYCwgYDIwMjEtMTItMDFgKSkgJT4lIA0KICBtdXRhdGUoZ2FwX21vbnRocyA9IGNhc2Vfd2hlbihzdHJfZGV0ZWN0KGdhcHMsICJ5bm5ubm5ubm5ubm55IikgfiAxMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ubm5ubm5ubm55IikgfiAxMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ubm5ubm5ubnkiKSB+IDksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlubm5ubm5ubnkiKSB+IDgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlubm5ubm5ueSIpIH4gNywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ubm5ubnkiKSB+IDYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlubm5ubnkiKSB+IDUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlubm5ueSIpIH4gNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChnYXBzLCAieW5ubnkiKSB+IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlubnkiKSB+IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZ2FwcywgInlueSIpIH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKSANCg0KIyMgY29tbWVudGVkIG91dCwgYnV0IHRoaXMgd2FzIGp1c3QgdG8gZ2V0IHRoZSBudW1iZXIgb2YgdG93bnNoaXBzIHdpdGggZ2FwcyBwZXIgc3RhdGUNCiMgZ2FwX21vbnRocyAlPiUgDQojICAgZmlsdGVyKHJlY3VycmVuY2VzID4gMSkgJT4lIA0KIyAgIGdyb3VwX2J5KHN0YXRlLCB0b3duc2hpcCkgJT4lIA0KIyAgIHN1bW1hcmlzZShhdmdfZ2FwID0gbWVhbihnYXBfbW9udGhzKSwgDQojICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuX21heCkpICU+JSANCiMgICBhcnJhbmdlKGRlc2MoYXZnX2dhcCkpICU+JQ0KIyAgIGZpbHRlcihhdmdfZ2FwID4gMCkgJT4lIA0KIyAgIGdyb3VwX2J5KHN0YXRlKSAlPiUNCiMgICBzdW1tYXJpc2UodG93bnNoaXBzID0gbl9kaXN0aW5jdCh0b3duc2hpcCkpDQoNCmdhcF9tb250aHMgJT4lIA0KICBmaWx0ZXIocmVjdXJyZW5jZXMgPiAxKSAlPiUgDQogIGdyb3VwX2J5KGdhcF9tb250aHMpICU+JSANCiAgc3VtbWFyaXNlKGxvY2F0aW9ucyA9IG5fZGlzdGluY3QobG9jYXRpb24pLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdCh0b3duc2hpcCksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gc3VtKGJlbl9tYXgpKSAlPiUgDQogIG11dGF0ZShwY19vZl9iZW4gPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lDQogIGthYmxlKGNhcHRpb24gPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYW5kIGxvY2F0aW9ucyBieSBkdXJhdGlvbiBvZiBnYXBzIGluIGltcGxlbWVudGF0aW9uIiwgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgIA0KICBmb290bm90ZSgiT25seSBiZW5lZmljaWFyaWVzIG9mIG1vbnRobHkgYWN0aXZpdGllcyB0aGF0IHJlY3VycmVkIGF0IGxlYXN0IG9uY2UgYXJlIGluY2x1ZGVkIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KICAjIHBhbmRlcihjYXB0aW9uID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzIGFuZCBsb2NhdGlvbnMgYnkgZHVyYXRpb24gb2YgZ2FwcyBpbiBpbXBsZW1lbnRhdGlvbiIpDQoNCiMgcmVtaW5kZXIgdG8gY2hlY2sgdGhlIHBhcmFncmFwaCBiZWxvdyB3aGVuIHlvdSByZXJ1biB0aGUgcmVwb3J0DQoNCmBgYA0KIA0KIDxicj4NCiANCmByIHJvdW5kKGZpbHRlcihnYXBfbW9udGhzLCByZWN1cnJlbmNlcyA+IDEgJiBnYXBfbW9udGhzID4gMCApICU+JSB7c3VtKC4kYmVuX21heCl9IC8gZmlsdGVyKGdhcF9tb250aHMsIHJlY3VycmVuY2VzID4gMSkgJT4lIHtzdW0oLiRiZW5fbWF4KX0gKiAxMDApYCUgb2YgYmVuZWZpY2lhcmllcyBvZiBtb250aGx5IGFjdGl2aXRpZXMgZXhwZXJpZW5jZWQgZ2FwcyBvciBkZWxheXMgaW4gbW9udGhseSBwcm9ncmFtbWluZywgd2l0aCB0aGUgbW9zdCBjb21tb24gZGVsYXkgYmVpbmcgMyBtb250aHMuIFRoZSA4LW1vbnRoIGRlbGF5IHdhcyB0aGUgcHJvdmlzaW9uIG9mIG1vbnRobHkgZm9vZCBiYXNrZXRzIGluIEJ1dGhpZGF1bmcsIHdoZXJlIGRpc3RyaWJ1dGlvbnMgb25seSBvY2N1cnJlZCBpbiBGZWJydWFyeSBhbmQgTm92ZW1iZXIgMjAyMS4gVGhlIDUtbW9udGggZGVsYXlzIHdlcmUgYWxsIGZyb20gbG9jYXRpb25zIGluIFJha2hpbmUgYW5kIEthY2hpbi4gT3ZlcmFsbCwgZ2FwcyBpbiBtb250aGx5IHByb2dyYW1taW5nIHdlcmUgZXhwZXJpZW5jZWQgaW4gMzkgdG93bnNoaXBzLCB3aXRoIHRoZSBtYWpvcml0eSBvcmdpbmF0aW5nIGZyb20gS2FjaGluLCBBeWV5YXJ3YWR5IGFuZCBSYWtoaW5lLg0KDQpUaGVyZSBhcmUgYHIgZmlsdGVyKGdhcF9tb250aHMsIHJlY3VycmVuY2VzID09IDEpICU+JSBucm93KClgIGVudHJpZXMgY29kZWQgYXMgYmVpbmcgaW1wbGVtZW50ZWQgb24gYSBtb250aGx5IGJhc2lzIHRoYXQgaGF2ZSBub3QgcmVjdXJyZWQgLS0gdGhhdCBpcywgdGhleSBoYXZlIG9ubHkgYmVlbiBpbXBsZW1lbnRlZCBvbmNlOiB0aGUgRlNDIG5lZWRzIHRvIGNoZWNrIHdpdGggcGFydG5lcnMgaWYgdGhlc2UgYXJlIG1lcmVseSB0aGUgZmlyc3QgaW5zdGFuY2VzIG9mIHRoZXNlIGFjdGl2aXRpZXMsIG9yIGlmIHRoZXJlIGhhdmUgYmVlbiBpc3N1ZXMgd2l0aCBhY2Nlc3MsIHNlY3VyaXR5IG9yIGZ1bmRpbmcgb3IgaWYgdGhleSBhcmUgZXJyb3JzIGluIGRhdGEgZW50cnkgLg0KDQo8YnI+PGJyPg0KDQojIyMgNC41IFBvdGVudGlhbCBmb3IgcG9zdC1kaXN0cmlidXRpb24gbW9uaXRvcmluZw0KDQpUaGUgdGFibGUgYmVsb3cgc2hvd3MgYWN0aXZpdGllcyB3aGljaCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgZm9yIDYgbW9udGhzIG9yIG1vcmUsIHRoZSBudW1iZXIgb2YgbG9jYXRpb25zIHRoZXkgd2VyZSBpbXBsZW1lbnRlZCBpbiBhbmQgdGhlIG51bWJlciBvZiB1bmlxdWUgYmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IGFjdGl2aXRpZXMgbWVldGluZyB0aGVzZSBjcml0ZXJpYS4gVGhlIHBvc3NpYmlsaXR5IG9mIGpvaW50IG1vbml0b3JpbmcgLS0gb3IgYXQgbGVhc3QgdGhlIGpvaW50IHJldmlldyBhbmQgYW5hbHlzaXMgb2YgbW9uaXRvcmluZyBkYXRhIC0tIHNob3B1bGQgYmUgZXhwbG9yZWQsIGluIGNvbnN1bHRhdGlvbiB3aXRoIHRoZXNlIHBhcnRuZXJzLiBUaGUgcmF0aW9uYWxlIGJlaW5nIHRoYXQgNiBtb250aHMgb2YgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIGEgbG9uZyBlbm91Z2ggcGVyaW9kIG9mIHRpbWUgdG8gbWFrZSBpbXBhY3QgbW9uaXRvcmluZyBmZWFzaWJsZS4gQWRkaXRpb25hbGx5LCBqb2ludCBtb25pdG9yaW5nIHdpbGwgYmUgZnVydGhlciBmYWNpbGl0YXRlZCBieSB0aGUgc2ltaWxhcml0eSBvZiB0aGVzZSBhY3Rpdml0aWVzLCBhbG1vc3QgYWxsIG9mIHdoaWNoIGFyZSByZWN1cnJlbnQgY2FzaCB0cmFuc2ZlcnMgb3IgZGlzdHJpYnV0aW9ucyBvZiBmb29kIGJhc2tldHMuDQoNCmBgYHtyIHRhYmxlLW1vbnRobHktYWN0aXZpdGllcy02LTktbW9udGhzLCB3YXJuaW5nPUZBTFNFfQ0KDQpnYXBfbW9udGhzICU+JSAgDQogIGZpbHRlcihyZWN1cnJlbmNlcyA+IDUpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHkpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpLA0KICAgICAgICAgICAgbG9jYXRpb25zID0gbigpLA0KICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5fbWF4KSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcywgYnkgYWN0aXZpdHksIHdobyBoYXZlIHJlY2VpdmVkIGF0IGxlYXN0IDYgbW9udGhzIG9mIHJlY3VycmVudCBmb29kIHNlY3VyaXR5IHN1cHBvcnQiLA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigpICU+JSAgDQogIGZvb3Rub3RlKCJPbmx5IGluY2x1ZGVzIGJlbmVmaWNpYXJpZXMgKG5vdCB1bmlxdWUgYnV0IG1heGltdW0gYnkgbG9jYXRpb24gYnkgYWN0aXZpdHkpIHdobyBoYXZlIHJlY2VpdmVkIG1vcmUgdGhhbiA2IG1vbnRocyBvZiBzdXBwb3J0IiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KICAjIHBhbmRlcihjYXB0aW9uID0gIk51bWJlciBvZiBiZW5lZmljaWFyaWVzLCBieSBhY3Rpdml0eSwgd2hvIGhhdmUgcmVjZWl2ZWQgYXQgbGVhc3QgNiBtb250aHMgb2YgcmVjdXJyZW50IGZvb2Qgc2VjdXJpdHkgc3VwcG9ydCIpDQoNCmBgYA0KDQo8YnI+DQoNClRoZXNlIGFyZSB0aGUgcGFydG5lcnMgd2hvIGhhdmUgaW1wbGVtZW50ZWQgbW9udGhseSBmb29kIGJhc2tldHMgYW5kIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMgZm9yIG1vcmUgdGhhbiA2IG1vbnRoczoNCg0KYGBge3IgdGFibGUtcGFydG5lcnMtNi1tb250aHN9DQpnYXBfbW9udGhzICU+JSAgDQogIGZpbHRlcihyZWN1cnJlbmNlcyA+IDUpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHksIGltcGxlbWVudGluZ19wYXJ0bmVycykgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5fbWF4KSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lICANCiAgZmlsdGVyKGFjdGl2aXR5ID09ICJQcm92aWRlIG1vbnRobHkgZm9vZCBiYXNrZXRzIiB8IGFjdGl2aXR5ID09ICJQcm92aWRlIG1vbnRobHkgY2FzaC1iYXNlZCB0cmFuc2ZlcnMiKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBhY3Rpdml0eSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiUGFydG5lcnMgd2hvIGhhdmUgaW1wbGVtZW50ZWQgY2FzaCB0cmFuc2ZlcnMgYW5kIGZvb2QgYmFza2V0cyBmb3IgYXQgbGVhc3QgNiBtb250aHMiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKSAlPiUgIA0KICBmb290bm90ZSgiT25seSBpbmNsdWRlcyBiZW5lZmljaWFyaWVzIChub3QgdW5pcXVlIGJ1dCBtYXhpbXVtIGJ5IGxvY2F0aW9uIGJ5IGFjdGl2aXR5KSB3aG8gaGF2ZSByZWNlaXZlZCBtb3JlIHRoYW4gNiBtb250aHMgb2Ygc3VwcG9ydCIsDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCiMgcGFuZGVyKGNhcHRpb24gPSAiUGFydG5lcnMgd2hvIGhhdmUgaW1wbGVtZW50ZWQgY2FzaCB0cmFuc2ZlcnMgYW5kIGZvb2QgYmFza2V0cyBmb3IgYXQgbGVhc3QgNiBtb250aHMiKQ0KYGBgDQoNCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNS4gTmV4dCBzdGVwcyBmb3IgMjAyMg0KDQojIyMgNS4xIFBvc2l0aW9uaW5nIGZvciAyMDIyDQoNClRoZSBQSU4gZm9yIDIwMjIgaXMgbXVjaCBtb3JlIGV2ZW5seSBzcHJlYWQgYWNyb3NzIHRoZSBjb3VudHJ5IHRoYW4gaXQgd2FzIGluIDIwMjE6IHdpdGggcmVmZXJlbmNlIHRvIHRoZSBwbG90IGJlbG93LCBNYWd3YXkgYW5kIE1hbmRhbGF5IGhhdmUgc29tZSBvZiB0aGUgbG93ZXN0IHByb3BvcnRpb25zIG9mIHZ1bG5lcmFibGUgcGVyc29ucyBpbiByZWxhdGlvbiB0byB0aGUgdG90YWwgc3RhdGUgcG9wdWxhdGlvbiwgbWVhbmluZyB0aGF0IGNhcmVmdWwgYmVuZWZpY2lhcnkgc2VsZWN0aW9uIGFuZCB0aWdodCB2dWxuZXJhYmlsaXR5IGluIHRoZXNlIGFyZWFzIHdpbGwgbmVjZXNzYXJ5IHRvIGF2b2lkIGV4Y2Vzc2l2ZSBpbmNsdXNpb24gZXJyb3JzLg0KDQo8YnI+DQoNCmBgYHtyIGJhcnBsb3QtcGluLXZ1bC1zdGF0ZX0NCnBpbiAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIGZpbHRlcihzdGF0ZSAhPSAiTmF5IFB5aSBUYXciKSAlPiUgDQogIHN1bW1hcmlzZShwaW5fMjAyMiA9IHJvdW5kKHN1bShwaW5fMjAyMikpLA0KICAgICAgICAgICAgdG90YWxfcG9wID0gc3VtKHRvdGFsX3BvcCkpICU+JSANCiAgbXV0YXRlKGAlX29mX3BvcF9pbl9QSU5gID0gcm91bmQocGluXzIwMjIgLyB0b3RhbF9wb3AgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgc3RhdGUgPSByZW9yZGVyKHN0YXRlLCAtYCVfb2ZfcG9wX2luX1BJTmApKSAgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBzdGF0ZSwgeSA9IHBpbl8yMDIyLCBmaWxsID0gYCVfb2ZfcG9wX2luX1BJTmApKSArDQogIGdlb21fY29sKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYCVfb2ZfcG9wX2luX1BJTmApLCBzaXplID0gMi41LCB2anVzdCA9IC0wLjUpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA3MCwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gMC42KSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBwZW9wbGUgaW4gbmVlZCIsIA0KICAgICAgIGZpbGwgPSAiJSBvZiBwb3AgXG4gaW4gUElOIiwNCiAgICAgICB0aXRsZSA9ICIyMDIyIFBJTiBhbmQgaW5jaWRlbmNlIG9mIGZvb2QgaW5zZWN1cml0eSBhbmQgZGlzcGxhY2VtZW50IGJ5IHN0YXRlIGFuZCByZWdpb24iLA0KICAgICAgIHN1YnRpdGxlID0gIlRoZSAyMDIyIGZvb2Qgc2VjdXJpdHkgUElOIGlzIHRoZSBudW1iZXIgb2YgcGVyc29ucyB3aG8gYXJlIGZvb2QgaW5zZWN1cmUgb3IgYXJlIElEUHMiKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjQwMDAwMCwgYnkgPSAyMDAwMDApLCBsYWJlbHMgPSBjb21tYSkgKw0KICBzY2FsZV9maWxsX2NvbnRpbnVvdXModHJhbnMgPSAicmV2ZXJzZSIpDQpgYGANCg0KPGJyPg0KDQpgYGB7ciB2ZWN0b3ItYW5kLWRmLWZvci1waW4tc3RhY2tlZH0NCnNyX3Bpbl9vcmQgPC0gYygiQ2hpbiIsICJLYXlhaCIsICJSYWtoaW5lIiwgIlNoYW4gKFNvdXRoKSIsICJTaGFuIChOb3J0aCkiLCAiU2hhbiAoRWFzdCkiLCAiS2F5aW4iLCAiQXlleWFyd2FkeSIsICJLYWNoaW4iLCAiVGFuaW50aGFyeWkiLA0KICAgICAgICAgICAgICAgICJNb24iLCAiQmFnbyAoRWFzdCkiLCAiQmFnbyAoV2VzdCkiLCAiWWFuZ29uIiwgIk1hZ3dheSIsICJTYWdhaW5nIiwgIk1hbmRhbGF5IikNCg0Kc3JfcGluX2JhciA8LSBwaW4gJT4lIA0KICBmaWx0ZXIoc3RhdGUgIT0gIk5heSBQeWkgVGF3IikgJT4lDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShwaW5fMjAyMiA9IHJvdW5kKHN1bShwaW5fMjAyMikpLA0KICAgICAgICAgICAgdGFyZ2V0XzIwMjIgPSByb3VuZChzdW0odGFyZ2V0X25ldykpKSAlPiUgDQogIG11dGF0ZShub25fdGFyZ2V0ID0gcGluXzIwMjIgLSB0YXJnZXRfMjAyMiwgDQogICAgICAgICBzdGF0ZSA9IGZjdF9yZWxldmVsKHN0YXRlLHNyX3Bpbl9vcmQpKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHRhcmdldF8yMDIyLCBub25fdGFyZ2V0KSwgbmFtZXNfdG8gPSAiaXNfdGFyZ2V0IiwgdmFsdWVzX3RvID0gInBpbiIpICU+JSANCiAgbXV0YXRlKHBjX29mX3BpbiA9IHJvdW5kKHBpbiAvIHBpbl8yMDIyICogMTAwLCBkaWdpdHMgPSAyKSkgDQoNCmBgYA0KDQoNClRoZSBhdmVyYWdlIHBlcmNlbnRhZ2Ugb2YgYSBzdGF0ZSdzIFBJTiB0aGF0IGlzIGluY2x1ZGVkIGluIHRoZSB0YXJnZXQgaXMgYHIgcm91bmQoc3JfcGluX2JhciAlPiUgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHBjX29mX3Bpbltpc190YXJnZXQgPT0gInRhcmdldF8yMDIyIl0pKSwgZGlnaXRzID0gMikgJT4lIHB1bGwoKWAlLCB0aG91Z2ggdGhlcmUgYXJlIHNvbWUgdmVyeSBub3RhYmxlIGV4Y2VwdGlvbnMgYXQgYm90aCB0aGUgc3VwZXJpb3IgYW5kIGluZmVyaW9yIGVuZHMgb2YgdGhlIHNjYWxlOg0KDQo8YnI+IA0KDQpgYGB7ciBzdGFja2VkLWJhcnBsb3QtcGluLXRhcmdldH0NCnNyX3Bpbl9iYXIgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBzdGF0ZSwgeSA9IHBpbiwgZmlsbCA9IGlzX3RhcmdldCkpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwY19vZl9waW4pLCBzaXplID0gMiwgdmp1c3QgPSAxLjIsIGNvbG91ciA9ICJ3aGl0ZSIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA3MCwgdmp1c3QgPSAwLjUsIGhqdXN0ID0gMC42KSwgDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSkgKw0KICBsYWJzKHggPSAiIiwNCiAgICAgICB5ID0gIk51bWJlciBvZiBwZW9wbGUgaW4gbmVlZCIsIA0KICAgICAgIGZpbGwgPSAiIiwNCiAgICAgICB0aXRsZSA9ICIyMDIyIHRhcmdldCBhcyBwYXJ0IG9mIFBJTiBieSBzdGF0ZSBhbmQgcmVnaW9uIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIGluIGVhY2ggYmFyIHNob3cgdGhlIHBlcmNlbnRhZ2Ugb2YgUElOIGluIGFuZCBvdXQgb2YgdGhlIDIwMjIgdGFyZ2V0cyIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyNDAwMDAwLCBieSA9IDIwMDAwMCksIGxhYmVscyA9IGNvbW1hKQ0KDQogICAgICAgICAgDQpgYGANCg0KPGJyPiANCg0KYGBge3IgaGFzLXBhcnRuZXItZGF0YXNldH0NCmhhc19wYXJ0bmVyIDwtIHBpbiAlPiUgc2VsZWN0KHN0YXRlLCBhZG1pbjNfcGNvZGUsIHRvd25zaGlwLCBwaW5fbmV3KSAlPiUgDQogIGxlZnRfam9pbihiZW4gJT4lICANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUgDQogIG11dGF0ZShoYXNfcGFydG5lciA9IGlmZWxzZShwYXJ0bmVycyA9PSAwLCBGQUxTRSwgVFJVRSkpICU+JSANCiAgZ3JvdXBfYnkoaGFzX3BhcnRuZXIpICU+JSANCiAgc3VtbWFyaXNlKHBpbl8yMDIyID0gc3VtKHBpbl9uZXcpLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbigpKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCJjb2wiKSAlPiUgDQogIG11dGF0ZShwaW5fMjAyMiA9IHJvdW5kKHBpbl8yMDIyICogMTAwLCBkaWdpdHMgPSAyKSwNCiAgICAgICAgIHRvd25zaGlwcyA9IHJvdW5kKHRvd25zaGlwcyAqIDEwMCwgZGlnaXRzID0gMikpIA0KDQpgYGANCg0KRm9vZCBTZWN1cml0eSBDbHVzdGVyIHBhcnRuZXJzIGFyZSBub3Qgd2VsbC1wb3NpdGlvbmVkIHRvIGNvdmVyIHRoZSAyMDIyIHBvcHVsYXRpb24gaW4gbmVlZC4gUGFydG5lcnMgYXJlIGxhcmdlbHkgY29uY2VudHJhdGVkIGluIEthY2hpbiwgUmFraGluZSBhbmQgWWFuZ29uLCB3aXRoIG9ubHkgb25lIHBhcnRuZXIgcHJlc2VudCBpbiBTaGFuIChFYXN0KSBhbmQgdHdvIGluIFRhbmludGhhcnlpLg0KDQpPdmVyYWxsLCBgciByb3VuZChoYXNfcGFydG5lciAlPiUgZmlsdGVyKGhhc19wYXJ0bmVyID09IEZBTFNFKSAlPiUgcHVsbCh0b3duc2hpcHMpKWAlIG9mIHRvd25zaGlwcywgY29udGFpbmluZyBgciByb3VuZChoYXNfcGFydG5lciAlPiUgZmlsdGVyKGhhc19wYXJ0bmVyID09IEZBTFNFKSAlPiUgcHVsbChwaW5fMjAyMikpYCUgb2YgdGhlIDIwMjIgUElOLCBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudC4gVGhpcyBsYWNrIG9mIG5hdGlvbndpZGUgY292ZXJhZ2Ugd2lsbCBiZSBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IGNvbnN0cmFpbnRzIHRoYXQgdGhlIEZTQyB3aWxsIGZhY2UgaW4gbWVldGluZyB0aGUgMjAyMiBuZWVkcyBvZiB2dWxuZXJhYmxlLCBmb29kIGluc2VjdXJlIHBlcnNvbnMgYW5kIElEUHMgLS0gYW5kIHJlc29sdmluZyB0aGlzIHdpbGwgbmVjZXNzaXRhdGUgYm90aCBpbmNyZWFzaW5nIHBhcnRuZXIgY292ZXJhZ2UgYW5kIGZpbmRpbmcgbmV3IHBhcnRuZXJzIGZvciB0aGUgY2x1c3Rlci4NCg0KYGBge3IgbWFwLXBhcnRuZXJzLXBpbi10b3duc2hpcCwgZmlnLmhlaWdodD0xMH0NCiMgcGxheSB3aXRoIGdlb21fbGluZSBmb3IgdGhlIGludGVyYWN0aXZlIHJlZmVyZW5jZSBtYXAgLS0gbWF5YmUgeW91IGNhbiBnZXQgdGhlIG91dGxpbmVzIHRvIGJlIGluIGRpZmZlcmVudCBjb2xvdXJzDQoNCmJlbiAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVycykpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IHBhcnRuZXJzKSwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50KHRyYW5zID0gInJldmVyc2UiLCBicmVha3MgPSBjKDEsIDMsIDUsIDcsIDksMTEpKSArDQogIHRoZW1lX3ZvaWQoKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpKSArDQogIGxhYnModGl0bGUgPSAiTWFwIG9mIG51bWJlciBvZiBwYXJ0bmVycyBieSB0b3duc2hpcCIsDQogICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgZG8gbm90IGhhdmUgYW55IHBhcnRuZXJzIHByZXNlbnQiKSArDQoNCnBpbiAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UoUElOID0gc3VtKHBpbl9uZXcpKSAlPiUgDQogIG11dGF0ZShQSU4gPSByb3VuZChQSU4sIGRpZ2l0cyA9IDApLCANCiAgICAgICAgIFBJTiA9IHJlY29kZShQSU4sIA0KICAgICAgICAgICAgICAgICAgICAgICcwJyA9IE5BX3JlYWxfKSkgJT4lDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBQSU4pLCBzaXplID0gMC4xKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQodHJhbnMgPSAicmV2ZXJzZSIsIGJyZWFrcyA9IGMoMTAwMDAsIDUwMDAwLCAxMDAwMDAsIDE1MDAwMCwgMTgwMDAwKSkgKw0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpKSArDQogIGxhYnModGl0bGUgPSAiTWFwIG9mIDIwMjIgUElOIGJ5IHRvd25zaGlwIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJ0b3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgUElOIGVzdGltYXRlZCBmb3IgdGhlbSIpDQoNCmBgYA0KDQpUaGlzIG1pc21hdGNoIGJldHdlZW4gcGFydG5lciBleGlzdGluZyBwYXJ0bmVyIGZvb3RwcmludHMgYW5kIHRoZSBQSU4gZm9yIDIwMjIgaGlnaGxpZ2h0cyB0aGUgbmVlZCBmb3IgbW9yZSBkZWRpY2F0ZWQgZmllbGQtbGV2ZWwgY29vcmRpbmF0aW9uLiBUaGlzIHdpbGwgYmUgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHJlYWNoIG91dCB0byBhbmQgY3VsdGl2YXRlIG5ldyBwYXJ0bmVycyBhbmQgZW5jb3VyYWdlIGV4aXN0aW5nIHBhcnRuZXJzIHRvIGV4cGFuZCB0aGVpciBvcGVyYXRpb25zLiBTdHJlbmd0aGVuZWQgaW50ZXItY2x1c3RlciB3aWxsIGFsc28gYmUga2V5IHRvIGVuc3VyZSB0aGF0IHRoZSBuZWVkcyBvZiBwZXJzb25zIGluIG5lZWQgYXJlIGJlaW5nIG1ldCBpbiBhIGNvbXByZWhlbnNpdmUgbWFubmVyLiAgICANCg0KPGJyPjxicj4NCg0KIyMjIDUuMiBOZXh0IHN0ZXBzDQoNCjEuICBDb21tdW5pY2F0ZSB0byBwYXJ0bmVycyB0aGF0IFlhbmdvbiBpcyBzZXZlcmVseSBvdmVyc3Vic2NyaWJlZCBpbiBjb21wYXJpc29uIHRvIHRoZSByZXN0IG9mIHRoZSBjb3VudHJ5LCBhYm92ZSBhbGwgaW4gdGhlIHRvd25zaGlwcyBvZiBIbGFpbmd0aGFyeWEsIFNod2VweWl0aGFyLCBEYWdvbiBNeW90aGl0IChTZWlra2FuKSwgRGFsYSBhbmQgTm9ydGggT2trYWxhcGEuDQoNCjIuICBDb2xsZWN0IGV4aXN0aW5nIGludGVydmVudGlvbiBwYWNrYWdlcyBmcm9tIHBhcnRuZXJzIGluIG9yZGVyIHRvIGJlZ2luIHRoZSBwcm9jZXNzIG9mIHN0YW5kYXJkaXNhdGlvbiBhbmQgdG8gc3VwcG9ydCB0aGUgcmV2aWV3IG9mIGZvb2QgYmFza2V0cyBmb3IgdGhlaXIgY2Fsb3JpYyBhbmQgbnV0cml0aW9uYWwgdmFsdWUuIFBlcmZvcm0gYWRkaXRpb25hbCBhbmFseXNpcyB0byB1bmRlcnN0YW5kIGlmIGJlbmVmaWNpYXJpZXMgaW4gY2xvc2UgcHJveGltaXR5IHRvIGVhY2ggb3RoZXIgaGF2ZSByZWNlaXZlZCB3aWRlbHkgZGl2ZXJnZW50IHBhY2thZ2UgdmFsdWVzLiBBZGRpdGlvbmFsbHksIHNwZWFrIHdpdGggcGFydG5lcnMgdG8gdW5kZXJzdGFuZCB3aHkgY2FzaCB0cmFuc2ZlciB2YWx1ZXMgdmFyeSBldmVuIHdpdGhpbiB0aGUgc2FtZSBhY3Rpdml0eSBpbXBsZW1lbnRlZCBieSB0aGUgc2FtZSBwYXJ0bmVyLg0KDQozLiAgUmV2aXNpdCBhcmVhcyB3aGljaCBoYXZlIG9ubHkgcmVjZWl2ZWQgc21hbGxlciBzdXBwbGVtZW50YXJ5IHRyYW5zZmVycyAtLSB0cmFuc2ZlcnMgY292ZXJpbmcgYSBsb3cgcGVyY2VudGFnZSBvZiB0aGUgTUVCIGNhbm5vdCBiZSBjb25zaWRlcmVkIHRvIGhhdmUgbWV0IHRoZSBmb29kIHNlY3VyaXR5IG5lZWRzIGZvciB0aGF0IGFyZWEgLS0gb3RoZXIgcGFydG5lcnMgbWF5IGJlIG5lY2Vzc2FyeSB0byBjb3ZlciB0aGUgZ2FwLg0KDQo0LiAgQWR2b2NhdGUgZm9yIHRoZSBleHBhbnNpb24gb2YgcGFydG5lcnMnIGdlb2dyYXBoaWMgZm9vdHByaW50cyB0byByZWFjaCB0aGUgcmVtYWluaW5nIDE3OSB0b3duc2hpcHMgd2hpY2ggaGF2ZSB5ZXQgdG8gYmVuZWZpdCBmcm9tIGFueSBGU0MgYWN0aXZpdGllcy4gVGhlIGVmZmVjdHMgb2YgdGhlIGN1cnJlbnQgY3Jpc2lzIGluIE15YW5tYXIgaGF2ZSBub3QgYmVlbiBkZXRlcm1pbmVkIGJ5IGFuIGVwaWNlbnRyZSBvciBhIHN0b3JtcGF0aCBhbmQgdGhlcmUgaXMgbm8gcHJvZ3JhbW1hdGljIHJhdGlvbmFsZSBmb3IgdGhlIHJlc3BvbnNlIHRvIGJlIHNvIHVuZXZlbi4gVGhpcyBhZHZvY2FjeSBzaG91bGQgYmUgdGFyZ2V0dGVkIGF0IHRoZSBJQ0NHLCBDbHVzdGVyIHBhcnRuZXJzIGFuZCBhdCBkb25vcnMuDQoNCjUuICBDb2xsZWN0IDVXIGRhdGEgZnJvbSBvdGhlciBjbHVzdGVycyBzbyB0aGF0IG11bHRpLXNlY3RvciBjb3ZlcmFnZSBtYXkgYmUgcmV2aWV3ZWQuIENsZWFuIGFuZCBwcm9jZXNzIGNvbmZsaWN0IGRhdGEgc28gdGhhdCBpdCBtYXkgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHBhcnRuZXJzJyBjb3ZlcmFnZS4gU2hhcmUgcmF3IGRhdGEgd2l0aCBvdGhlciBDbHVzdGVycyB0byBpbXByb3ZlIGNvb3JkaW5hdGlvbi4NCg0KNi4gIFdvcmsgd2l0aCBwYXJ0bmVycyB0byBkZXRlcm1pbmUgdGhlaXIgY3VycmVudCBjYXBhY2l0aWVzIHRvIHN1Ym1pdCBhZ2UgYW5kIHNleC1kaXNhZ2dyZWdhdGVkIGJlbmVmaWNpYXJ5IGRhdGEuIERldmVsb3AgYSB3b3JrcGxhbiB0byBlbnN1cmUgdGhhdCB0aGV5IGNhbiBtZWV0IHJlcG9ydGluZyByZXF1aXJlbWVudHMuDQoNCjcuICBTb2xpY2l0IG1vbml0b3JpbmcgcmVwb3J0cyBmcm9tIHBhcnRuZXJzIGFuZCBleHBsb3JlIHRoZSBwb3NzaWJpbGl0eSBvZiBqb2ludCBtb25pdG9yaW5nLg0KDQo4LiAgUmV2aXNlIHRoZSA1VyB0ZW1wbGF0ZSAtLSBpbiBjb25zdWx0YXRpb24gd2l0aCBwYXJ0bmVycyAtLSBpbiBvcmRlciB0byBhZGRyZXNzIHRoZSBkYXRhIGNvbGxlY3Rpb24gaXNzdWVzIGlkZW50aWZpZWQuDQoNCjxicj48YnI+PGJyPg0KDQojIyA2LiBSZWZlcmVuY2UgdGFibGUgLS0gdG93bnNoaXBzDQoNClRoZSByZWZlcmVuY2UgdGFibGUgYmVsb3cgbWF5IGJlIHNvcnRlZCBhbmQgZmlsdGVyZWQgYnkgYW55IG9mIHRoZSBjb2x1bW5zLiANCg0KYGBge3IgZGF0YXRhYmxlLXRvd25zaGlwcy1yZWZlcmVuY2V9DQojIGFkZCBpbiB0YXJnZXQNCnBpbiAlPiUgDQogIHNlbGVjdChzdGF0ZSwgdG93bnNoaXAsIGFkbWluM19wY29kZSwgdG90YWxfcG9wLCBQSU5fMjAyMiA9IHBpbl8yMDIyLCBJRFBzID0gaWRwcykgJT4lIA0KICBtdXRhdGUodG90YWxfcG9wID0gcm91bmQodG90YWxfcG9wLCBkaWdpdHMgPSAwKSkgJT4lIA0KICBsZWZ0X2pvaW4oZnNjICU+JQ0KICAgICAgICAgICAgICBzZWxlY3QoYWN0aXZpdHksIHBhcnRuZXJzID0gaW1wbGVtZW50aW5nX3BhcnRuZXJzLCBiZW5lZmljaWFyaWVzID0gdV9iZW4sIGJlbmVmaWNpYXJ5X2ZyZXF1ZW5jaWVzID0gYmVuZWZpY2lhcmllcywNCiAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QocGFydG5lcnMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJ5X2ZyZXF1ZW5jaWVzID0gc3VtKGJlbmVmaWNpYXJ5X2ZyZXF1ZW5jaWVzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9ucyA9IG5fZGlzdGluY3QobG9jYXRpb24pKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lDQogIHJlcGxhY2VfbmEobGlzdChwYXJ0bmVycyA9IDAsIGJlbmVmaWNpYXJpZXMgPSAwLCBiZW5lZmljaWFyeV9mcmVxdWVuY2llcyA9IDAsIGxvY2F0aW9ucyA9IDApKSAlPiUgDQogIHJlbG9jYXRlKGFkbWluM19wY29kZSwgLmFmdGVyID0gbG9jYXRpb25zKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gInRvcCIsIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdENvbXBsZXRlID0gaHRtbHdpZGdldHM6OkpTKA0KICAgICAgICAgICJmdW5jdGlvbihzZXR0aW5ncywganNvbikgeyIsDQogICAgICAgICAgcGFzdGUwKCIkKHRoaXMuYXBpKCkudGFibGUoKS5jb250YWluZXIoKSkuY3NzKHsnZm9udC1zaXplJzogJyIsICI4LjVwdCIsICInfSk7IiksDQogICAgICAgICAgIn0iKQ0KICAgICAgICkgDQogICAgICkgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDcuIEludGVyYWN0aXZlIHJlZmVyZW5jZSBtYXBzDQoNCjxicj4NCg0KIyMjIDcuMSBNYXAgb2YgMjAyMiBQSU4gYnkgdG93bnNoaXANCg0KYGBge3IgcmVmZXJlbmNlLW1hcC1nZ3Bsb3RseSwgZmlnLmhlaWdodD0xMH0NCg0KIyBJIHRoaW5rIHlvdSBuZWVkIHRvIGNvYWxlc2NlIHRoZSBzdGF0ZXMgYW5kIHRvd25zaGlwcyB3aXRoIHBjb2RlM19zaGFwZSBvciBzdGFydCB3aXRoIHBjb2RlM19zaGFwZQ0KdHNwX21hcCA8LSBwY29kZTNfc2hhcGUgJT4lIA0KICBsZWZ0X2pvaW4oYmVuICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGFjdGl2aXR5KSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHBpbiAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KGFkbWluM19wY29kZSwgdG90YWxfcG9wLCBpZHBzLCBwaW5fbmV3KSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICByZXBsYWNlKGlzLm5hKC4pLCAwKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9wb3AgPSByb3VuZCh0b3RhbF9wb3ApKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAwLjEsDQogICAgICAgICAgYWVzKGZpbGwgPSBwaW5fbmV3LA0KICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKHRvd25zaGlwLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBJTiAyMDIyOiAiLCBwaW5fbmV3LCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbCBwb3A6ICIsIHRvdGFsX3BvcCwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSURQczogIiwgaWRwcywgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnIGNvdW50OiAiLCBwYXJ0bmVycywgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuZWZpY2lhcmllczogIiwgYmVuZWZpY2lhcmllcykpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEpICsgDQogIGxhYnMoZmlsbCA9ICJQSU4gMjAyMiIsDQogICAgICAgdGl0bGUgPSAiTWFwIG9mIHRvd25zaGlwcyBieSAyMDIyIFBJTiIpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSANCg0KZ2dwbG90bHkodHNwX21hcCwgdG9vbHRpcCA9IGMoInRleHQiKSkgJT4lDQogIGxheW91dChzaG93bGVnZW5kID0gVFJVRSwgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNikpKSAlPiUgDQogIHBsb3RseTo6c3R5bGUoaG92ZXJvbiA9ICJmaWxsIikgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIk1hcCBvZiB0b3duc2hpcHMgYnkgMjAyMiBQSU4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3VzZSBvdmVyIGZvciBkZXRhaWxzOyBjbGljayBhbmQgZHJhZyB0byBzZWxlY3QgYW5kIHpvb20iLCI8L3N1cD4iKSkpDQoNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA3LjIgTWFwIG9mIDIwMjEgYmVuZWZpY2lhcmllcyBieSB0b3duc2hpcA0KDQoNCmBgYHtyIGJlbmVmaWNpYXJpZXMtbWFwLWdncGxvdGx5LCBmaWcuaGVpZ2h0PTEwfQ0KDQojIEkgdGhpbmsgeW91IG5lZWQgdG8gY29hbGVzY2UgdGhlIHN0YXRlcyBhbmQgdG93bnNoaXBzIHdpdGggcGNvZGUzX3NoYXBlIG9yIHN0YXJ0IHdpdGggcGNvZGUzX3NoYXBlDQp0c3BfbWFwX2JlbiA8LSBwY29kZTNfc2hhcGUgJT4lDQogICMgc3RfbWFrZV92YWxpZCgpICU+JSAjIG5vdCBleGFjdGx5IHN1cmUgd2hhdCBlZmZlY3QgdGhpcyBpcyBoYXZpbmcgDQogIGxlZnRfam9pbihmc2MgJT4lDQogICAgICAgICAgICAgIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXJzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGFjdGl2aXR5KSksIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHBpbiAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhZG1pbjNfcGNvZGUsIHBpbl9uZXcpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2Yoc2l6ZSA9IDAuMSwNCiAgICAgICAgICBhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMsDQogICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAodG93bnNoaXAsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuZWZpY2lhcmllczogIiwgYmVuZWZpY2lhcmllcywgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnIGNvdW50OiAiLCBwYXJ0bmVycywgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWN0IGNvdW50OiAiLCBhY3Rpdml0aWVzLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQSU4gMjAyMjogIiwgcGluX25ldykpKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJtYWtvIiwgdHJhbnMgPSAibG9nMTAiLCBkaXJlY3Rpb24gPSAtMSwgYmVnaW4gPSAwLjE1KSArIA0KICBsYWJzKGZpbGwgPSAiYmVuZWZpY2lhcmllcyIsDQogICAgICAgdGl0bGUgPSAiTWFwIG9mIHRvd25zaGlwcyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gMjAyMSIpICsNCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOCksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSANCg0KZ2dwbG90bHkodHNwX21hcF9iZW4sIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JQ0KICAjICAgIyB0aGlzIGRvZXNuJ3QgZXhhY3RseSB3b3JrIHRoZXkgd2F5IEknZCBsaWtlIGl0IHRvDQogICMgICAjIHRvIGJlIHZlcnkgY2xlYXIsIGhvdmVyb24gPSAiZmlsbHMiIHdpbGwgY2F1c2UgdGhlIHRoaW5nIHRvIGNyYXNoIA0KICAjIHN0eWxlKCANCiAgIyAgIGhvdmVyb24gPSAiZmlsbHMiLA0KICAjICAgIyBvdmVycmlkZSB0aGUgY29sb3IgbWFwcGluZw0KICAjICAgbGluZS5jb2xvciA9IHRvUkdCKCJ3aGl0ZSIpLA0KICAjICAgIyBkb24ndCBhcHBseSB0aGVzZSBzdHlsZSBydWxlcyB0byB0aGUgZmlyc3QgdHJhY2UsIHdoaWNoIGlzIHRoZSBiYWNrZ3JvdW5kIGdyYXRpY3VsZS9ncmlkDQogICMgICB0cmFjZXMgPSBzZXEuaW50KDIsIGxlbmd0aCh0c3BfbWFwX2JlbiR4JGRhdGEpKQ0KICAjICkgJT4lDQogIGhpZGVfbGVnZW5kKCkgJT4lIA0KICBsYXlvdXQoc2hvd2xlZ2VuZCA9IFRSVUUsIGxlZ2VuZCA9IGxpc3QoZm9udCA9IGxpc3Qoc2l6ZSA9IDYpKSkgJT4lIA0KICBwbG90bHk6OnN0eWxlKGhvdmVyb24gPSAiZmlsbCIpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJNYXAgb2YgdG93bnNoaXBzIGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBpbiAyMDIxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlsczsgY2xpY2sgYW5kIGRyYWcgdG8gc2VsZWN0IGFuZCB6b29tIiwiPC9zdXA+IikpKQ0KDQpgYGANCg0K